<?xml version="1.0" encoding="UTF-8"?>
<rss>
<channel>
<title>王甲春（wjiachun、老猫）个人Blog</title>
<link>http://wang.minidns.net</link>
<Description>王甲春（wjiachun、老猫）个人Blog</Description>
<language>zh-cn</language>
<copyright>Copyright 2003-2004 Loveyuki</copyright>
<webMaster>webmaster@loveyuki.com</webMaster>
<image>
	<title>王甲春（wjiachun、老猫）个人Blog</title> 
	<url>http://wang.minidns.net/images/logos.gif</url> 
	<link>http://wang.minidns.net</link> 
	<description>王甲春（wjiachun、老猫）个人Blog</description> 
</image>
<item><link>http://wang.minidns.net/blogview.asp?logID=168</link><title><![CDATA[VBA查找指定部分文本的测试代码]]></title><author>wjiachun</author><category>技术档</category><pubDate>2008-11-18 8:28:58</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=168</guid><description><![CDATA[Cells.Find(What:=&quot;/*XXX&quot;,&nbsp;After:=ActiveCell,&nbsp;LookIn:=&nbsp;_<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlFormulas,&nbsp;LookAt:=xlPart,&nbsp;SearchOrder:=xlByRows,&nbsp;SearchDirection:=&nbsp;_<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlNext,&nbsp;MatchCase:=False,&nbsp;MatchByte:=False,&nbsp;SearchFormat:=False).Activate<br>&nbsp;&nbsp;&nbsp;&nbsp;e1&nbsp;=&nbsp;ActiveCell.Row<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Cells.Find(What:=&quot;XXXX*/&quot;,&nbsp;After:=ActiveCell,&nbsp;LookIn:=&nbsp;_<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlFormulas,&nbsp;LookAt:=xlPart,&nbsp;SearchOrder:=xlByRows,&nbsp;SearchDirection:=&nbsp;_<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlNext,&nbsp;MatchCase:=False,&nbsp;MatchByte:=False,&nbsp;SearchFormat:=False).Activate<br>&nbsp;&nbsp;&nbsp;&nbsp;e2&nbsp;=&nbsp;ActiveCell.Row<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Rows(CStr(e1)&nbsp;&amp;&nbsp;&quot;:&quot;&nbsp;&amp;&nbsp;CStr(e2)).Select<br>&nbsp;&nbsp;&nbsp;&nbsp;Selection.Copy<br>&nbsp;&nbsp;&nbsp;&nbsp;Sheets(&quot;Sheet2&quot;).Select<br>&nbsp;&nbsp;&nbsp;&nbsp;Range(&quot;A1&quot;).Select<br>&nbsp;&nbsp;&nbsp;&nbsp;ActiveSheet.Paste<br>]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=167</link><title><![CDATA[在vista上安装delphi7的解决方案]]></title><author>wjiachun</author><category>转贴篇</category><pubDate>2008-10-27 17:30:34</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=167</guid><description><![CDATA[相信很多delphi爱好者因在vista不能正常使用delphi7而烦恼，甚至有些朋友说vista的出现就是delphi的未日了。我可以明确告诉大家，delphi7绝对可以在vista下正常使用。在vista上安装过d7的朋友都知道，当你正常安装d7后，启动d7时，屏幕会出现一个对话框。对话框的提示很明显，delphi不能rename一个文件，这说明了什么？会不会是用户的权限不够？没错，你猜对了。我现在给大家提供一个解决方案，大家可以参考一下。&nbsp;<br>　　step1，修改“C:\Program&nbsp;Files\Borland\Delphi7\Bin”的权限（右击上面的目录-》属性-》安全-》编辑-》修改后确定退出），赋予于users组modify权限；<br><br>　　step2，修改“C:\Program&nbsp;Files\Borland\Delphi7\Projects”的权限（右击上面的目录-》属性-》安全-》编辑-》修改后确定退出），赋予于users组modify权限；<br><br>　　step3，运行d7，一切正常。<br><br>　　done!还等什么，赶快试试吧！]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=166</link><title><![CDATA[隐藏文件夹病毒清理助手 V 1.081014]]></title><author>wjiachun</author><category>技术档</category><pubDate>2008-10-13 10:57:05</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=166</guid><description><![CDATA[一、软件说明<br><font color="Blue">1.你的计算机是否出现“this&nbsp;computer&nbsp;is&nbsp;being&nbsp;attacked”？系统进程中是否出现Global.exe和Fonts.exe等，结束后又自动出现？是否发现U盘文件夹神秘“消失”？双击文件夹打开的却是当前计算机的图片文件夹？是否无法切换中文输入法？<br>2.出现以上症状之一，你可以尝试使用“隐藏文件夹病毒清理助手”清理病毒。<br>3.本软件只针对隐藏文件夹病毒中毒后辅助清理，不能清理其他病毒，也不能代替杀毒软件。</font><br>软件下载：<br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_0810/jg9m_yvn3_HSFILE081014.rar" target="_blank">点击下载此文件</a><br><br>二、使用说明<br>1.请严格按照界面提示使用本软件。<br>2.使用【2.病毒扫描】检测计算机是否中毒，若没有中毒可直接使用【4.按盘符清理】清除任意磁盘分区或U盘、移动硬盘等存储设备。<br>3.若上一步检测出系统已经感染病毒，则需要重新启动系统，进入“安全模式”后，使用【3.清除病毒】进行杀毒。<br>4.杀毒时需要按照【结束病毒进程】-【删除病毒文件】-【还原注册表】顺序依次清理。<br>5.作者承诺软件本身不对系统以及文件产生破坏，为保险起见仍请主动备份相关文件。<br><br>三、软件咨询或建议反馈：<br>北京市第二中学网络中心&nbsp;&nbsp;王甲春&nbsp;&nbsp;<br>Email:jiachun@gmail.com&nbsp;<br><a target="_blank" href="http://wang.minidns.net">http://wang.minidns.net</a><br><br>四、软件更新<br>&nbsp;&nbsp;20081014&nbsp;<br>修复清除病毒尸体时程序出现的异常，还原注册表的.reg文件关联。<br>&nbsp;&nbsp;20081013&nbsp;<br>第一次升级，在清理U盘基础上加上杀毒功能，彻底清除系统内病毒；同时BS一下对此病毒放手不管的大小商业收费杀毒软件，忙着挣钱却不顾用户计算机的死活。<br>&nbsp;&nbsp;20080908&nbsp;<br>新学期开学，制作软件，初步清理U盘本身。顺便BS一下听过本人《流氓软件与计算机安全漫谈》讲座后<br>依然中招的朋友，未听过讲座的可以在北京市教育资源网上找到讲座的录制资源；<br><br><font color="Red">PS.此贴改造为杀毒软件更新专用贴。&quot;this&nbsp;computer&nbsp;is&nbsp;being&nbsp;attacked&quot;&nbsp;病毒&nbsp;专杀。目前清理方式最简单彻底的专杀工具，已经由绿盟等众多网站提供下载！</font><br>]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=163</link><title><![CDATA[十一回老家后羿公园的照片]]></title><author>wjiachun</author><category>记事本</category><pubDate>2008-10-10 10:57:05</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=163</guid><description><![CDATA[非常漂亮的公园&nbsp;关键还free<br><img src="attachments/month_0810/mjbp_96xb_houyi.JPG" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>雕塑标志<br><img src="attachments/month_0810/mjbp_3zr6_waishengnv.JPG" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>与外甥女合影<br><img src="attachments/month_0810/mjbp_eb4h_qiao.JPG" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>奈何桥<br><img src="attachments/month_0810/nkcr_52t9_qiang.JPG" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>骑墙派]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=162</link><title><![CDATA[欢乐谷 凭教师证免费游玩]]></title><author>wjiachun</author><category>非技术</category><pubDate>2008-9-22 10:57:05</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=162</guid><description><![CDATA[人实在是太多了<br><img src="attachments/month_0810/qnft_96xb_DSC02821.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>忘了名字&nbsp;很刺激<br><img src="attachments/month_0810/yvn3_khao_DSC02864.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>这个一点不刺激<br><img src="attachments/month_0810/41t8_1xp4_DSC02868.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>蚂蚁王国<br><img src="attachments/month_0810/zwo3_41s7_DSC02883.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>摆个Y&nbsp;还有&nbsp;A&nbsp;P&nbsp;的照片没上]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=161</link><title><![CDATA[暑假蹲守 猜猜我拍到了什么？]]></title><author>wjiachun</author><category>非技术</category><pubDate>2008-9-1 10:57:05</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=161</guid><description><![CDATA[<img src="attachments/month_0810/tqix_if8m_ww.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br>蹲守&nbsp;猜猜我拍到了什么？]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=160</link><title><![CDATA[发布（PIE） Prolog Inference Engine 绿色汉化版]]></title><author>wjiachun</author><category>技术档</category><pubDate>2008-8-28 10:57:05</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=160</guid><description><![CDATA[Prolog&nbsp;Inference&nbsp;Engine&nbsp;绿色汉化版<br>本人从&nbsp;Visual&nbsp;Prolog&nbsp;7.1&nbsp;中提取并汉化<br>希望对研究人工智能的朋友有所帮助<br><br><br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_0810/2yq5_41s8_PIE.rar" target="_blank">点击下载此文件</a>]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=159</link><title><![CDATA[DelphiZeus 12. 多媒体和多线程计时器的使用]]></title><author>wjiachun</author><category>技术档</category><pubDate>2008-6-27 16:51:44</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=159</guid><description><![CDATA[<a target="_blank" href="blogview.asp?logID=145">返回首页</a><br><br>　　在《画刷、画笔和计时器入门》一文中，程序使用了一个计时器并发送&nbsp;WM_TIMER&nbsp;消息到&nbsp;MessageProc&nbsp;，这引起闪屏窗体改变其文本。如果希超过&nbsp;200&nbsp;毫秒的时间间隔，使用&nbsp;SetTimer(&nbsp;)&nbsp;获取时间事件是一个常规做法。对于低于&nbsp;200&nbsp;毫秒的时间间隔，系统计时器的精确度就会相当的低。因此我们必须做出一定的改进，使用多媒体计时器和多线程计时器。本文的定时器程序演示了如何使用&nbsp;SetTimer(&nbsp;)&nbsp;，通过一个独立的时间消息函数来完成同样的闪屏工作。另一种计时器——多媒体计时器用于显示动画。多媒体计时器比系统计时器更加精确控制&nbsp;SetTimer(&nbsp;)&nbsp;函数。另一种计时器——多线程计时器将被创建，演示如何创建一个独立线程并使用&nbsp;SleepEx(&nbsp;)&nbsp;函数激活计时事件。<br>　　为了演示系统计时器和多媒体计时器的不同精确度，两个一模一样的文字滚动函数被用于测试，一个通过系统计时器激活，另一个通过多媒体计时器激活，因此你可以看到文字滚动的快慢结果。为了度量这些计时器的实际时间间隔，本文使用了性能计数器，它每秒可以计数超过&nbsp;１&nbsp;百万次，可以用于最快的事件计时。多媒体计时器通常用于动画图像和精灵移动。本文将演示如何完成一个小球移动的动画，小球图片在某个范围的连续位置被绘制。动画显示的两种不同的方法在这里展示了，一种在显示处直接绘制小球，另一种喷绘整个区域来避免闪烁。<br>　　对于系统计时器我们以前使用过&nbsp;SetTimer(&nbsp;)&nbsp;函数，因此下面首先谈谈&nbsp;TimerProc&nbsp;函数的使用。&nbsp;&nbsp;<br><br><br>利用&nbsp;SetTimer(&nbsp;)&nbsp;使用&nbsp;TimerProc<br>　　这里我们使用&nbsp;TimerProc&nbsp;函数代替&nbsp;WM_TIMER&nbsp;消息激活定时事件。参见&nbsp;Win32&nbsp;API&nbsp;帮助中的&nbsp;TimerProc&nbsp;部分。在调用&nbsp;SetTimer(&nbsp;)&nbsp;函数的时候你需要给出&nbsp;TimerProc&nbsp;的地址作为最后一个参数，如：<br><br>SetTimer(hForm1,4,1000,&nbsp;@TimerProc);<br>　　否则，SetTimer(&nbsp;)&nbsp;就与前面《画刷、画笔和计时器入门》一文中一样，在&nbsp;WindowProc&nbsp;函数中使用&nbsp;WM_TIMER&nbsp;消息。如果你在&nbsp;SetTimer(&nbsp;)&nbsp;函数的最后一个参数给出一个方法地址，&nbsp;WM_TIMER&nbsp;消息将调用这个过程代替该消息完成工作。如果你查看下面的程序的&nbsp;TimerProc&nbsp;部分，你可以发现：<br><br>TimerProc(Wnd:&nbsp;HWnd;&nbsp;Mesg,&nbsp;TimerID,&nbsp;SysTime:&nbsp;Longint);&nbsp;stdcall;<br>　　这四个参数与&nbsp;MessageProc(&nbsp;)的参数类似，Wnd&nbsp;为&nbsp;hForm1，Mesg&nbsp;为&nbsp;WM_TIMER。我们还检测&nbsp;TimerID&nbsp;参数来获取&nbsp;ID&nbsp;编号，并为这个&nbsp;TimerID&nbsp;执行代码。SysTime&nbsp;参数是&nbsp;GetTickCount(&nbsp;)&nbsp;函数返回的系统&nbsp;TicCount&nbsp;。<br><br><br>多媒体计时器<br>　　多媒体计时器允许开发人员使用计算机硬件对应的最大分辨力（或精确度）的可能性来安排时间事件。多媒体计时器允许你安排时间时间高于其他计时服务的精确度，特别是使用&nbsp;SetTimer(&nbsp;)&nbsp;函数的系统计时器。<br>　　多媒体计时器对于需要高精度计时的程序非常有用。比如，一个&nbsp;MIDI&nbsp;音序器需要一个准确的计时器，因为它必须保持&nbsp;MIDI&nbsp;序列的事件排列在精确的&nbsp;1&nbsp;毫秒内。不像&nbsp;SetTimer(&nbsp;)&nbsp;函数使用的&nbsp;WM_TIMER&nbsp;消息，多媒体计时器可以在程序处理其他事件时触发它的回调函数。&nbsp;<br>　　为了获得多媒体计时器所能支持的最小和最大计时精度，可以使用&nbsp;timeGetDevCaps(&nbsp;)&nbsp;函数。这个函数使用允许的最小和最大计时精度填充&nbsp;TTimeCaps&nbsp;记录的wPeriodMin&nbsp;和&nbsp;wPeriodMax&nbsp;数值，这个范围与计算机以及&nbsp;Windows&nbsp;平台及版本关系密切。在获得多媒体计时器所能支持的最小和最大计时精度后，你必须设置你的程序需要使用的最小精度。使用&nbsp;timeBeginPeriod(&nbsp;)&nbsp;和&nbsp;timeEndPeriod(&nbsp;)&nbsp;函数可以设置和清除这个精度。你必须匹配每次调用&nbsp;timeBeginPeriod(&nbsp;)&nbsp;就要调用&nbsp;timeEndPeriod(&nbsp;)，在调用这两者时给出相同的最小精度。一个程序可以多次进行&nbsp;timeBeginPeriod(&nbsp;)&nbsp;调用，只要每次对应调用&nbsp;timeEndPeriod(&nbsp;)。<br>　　在你设置多媒体计时器的精度以后，你可以通过使用&nbsp;timeSetEvent(&nbsp;)&nbsp;函数开始计时事件。这个函数返回一个计时器标识，可以用于停止或分辨计时器事件。函数的第三个参数是&nbsp;TimeProc&nbsp;回调函数的地址，当计时器事件发生时函数被调用。一共有两种类型的多媒体计时器事件：单个与周期。单个的计时器事件只在特定毫秒数以后发生一次。周期计时器事件在每个特定毫秒数的时间间隔后持续激活。周期计时器的时间间隔被称作事件延迟。周期计时器事件延迟等于或小于&nbsp;10&nbsp;毫秒会消耗&nbsp;CPU&nbsp;资源的重要部分。在计时器事件中，计时器事件精度与事件延迟长度之间的关系非常重要。举例来说，如果你设置精度为&nbsp;5&nbsp;毫秒，事件延迟为&nbsp;100&nbsp;毫秒，多媒体计时器可以在&nbsp;95&nbsp;到&nbsp;105&nbsp;毫秒范围时间以后通知回调函数。你可以在任何时候使用&nbsp;timeKillEvent(&nbsp;)&nbsp;函数取消一个活动的计时器事件。切记在结束拥有&nbsp;TimerProc&nbsp;的程序或线程前取消掉所有外部计时器。为了使用多媒体计时器函数，你需要&nbsp;Uses&nbsp;子句部分加上&nbsp;mmsystem&nbsp;单元。<br><br><br>多媒体计时器工作于独立线程<br>　　为了保持高精度计时，多媒体计时器工作在它自己的&nbsp;Windows&nbsp;系统线程中。这个系统线程不会被系统模式对话框暂停，因此当你按下&nbsp;Ctrl&nbsp;-&nbsp;Alt&nbsp;-&nbsp;Delete&nbsp;键并得到关闭程序的对话框的时候，你程序的线程被暂停了，但是多媒体计时器线程持续运行并调用&nbsp;TimerProc&nbsp;，因此当系统模式对话框关闭后，对话框存在时调用的计时事件将会被无延迟调用。<br><br><br>多线程计时器<br>　　除了多媒体计时器，你可以创建一个单独的线程，使用&nbsp;SleepEX(&nbsp;)&nbsp;函数休眠该线程，每次&nbsp;SleepEX(&nbsp;)&nbsp;返回时激活一个事件。线程是操作系统分配处理时间的基本单元。线程可以运行任何一部分处理代码，包括正在被其他线程运行的部分。Windows&nbsp;操作系统支持多任务优先级，呈现的效果是多个线程同时执行。多个任务在进程或线程内分隔它们需要的可用处理时间。在&nbsp;API&nbsp;中创建一个独立线程允许线程不会被另一个线程的代码执行。本文不打算解释所有的独立线程的动态和因素。你可以参考&nbsp;Win32&nbsp;API&nbsp;帮助的&nbsp;Processes&nbsp;and&nbsp;Threads&nbsp;相关部分。<br>　　如果查看下面程序的代码的&nbsp;DoThreadTimer(&nbsp;)&nbsp;过程，你会注意到：<br><br>hThread&nbsp;:=&nbsp;BeginThread(nil,&nbsp;0,&nbsp;@ThreadFunc,&nbsp;nil,&nbsp;0,&nbsp;ThreadId);<br>　　&nbsp;BeginThread(&nbsp;)&nbsp;函数开启一个新的独立线程，因为第三个参数&nbsp;@ThreadFunc&nbsp;为：&nbsp;<br>function&nbsp;ThreadFunc(Parameter:&nbsp;Pointer):&nbsp;Integer;&nbsp;stdcall;<br>　&nbsp;　这就是将要执行的线程。这个&nbsp;ThreadFunc(&nbsp;)&nbsp;和一个&nbsp;.dpr&nbsp;程序代码的执行比较相似，这个线程在“begin”处开始执行，在“end;”处结束执行。因此，你需要循环以保持这个线程的活动状态，如果你在这个线程创建了窗体你也需要使用消息循环，但是本文没有创建窗体，只是使用一个&nbsp;While&nbsp;循环，循环体为&nbsp;SleepEx(TimerR.Interval,&nbsp;False);&nbsp;只要&nbsp;thdTiming&nbsp;为&nbsp;true&nbsp;，&nbsp;While&nbsp;循环将保持运行，因此你需要在开始这个线程前设置&nbsp;thdTiming&nbsp;为&nbsp;true。<br>　　更多信息请参看下面代码内的详细注释。<br>&nbsp;<br><br><br>&nbsp;<br><br>计时器程序<br><br><br>　　这个程序与《画刷、画笔和计时器入门》一文一样创建一个闪屏，但是它不是直接在桌面&nbsp;HDC&nbsp;上直接绘制，而是创建一个闪屏窗口并在上面绘制。前面的例子使用&nbsp;SetTimer(&nbsp;)&nbsp;处理闪屏上文字的显示并切换到主窗体，本例使用&nbsp;TimerProc&nbsp;处理&nbsp;WM_TIMER&nbsp;事件。本程序在&nbsp;580x42&nbsp;窗体上创建四个按钮和一个检查框。你应该注意到窗体类注册为&nbsp;CS_OWNDC&nbsp;风格：&nbsp;Style&nbsp;:=&nbsp;CS_BYTEALIGNCLIENT&nbsp;or&nbsp;CS_OWNDC;<br>　　CS_OWNDC&nbsp;风格给出窗体一个持续长久的&nbsp;HDC，被称作私有设备场景，一个为该类窗体所有的唯一的设备场景。因此，你只需要获取&nbsp;HDC&nbsp;一次，然后就可以在所有的喷绘中使用。尽管&nbsp;CS_OWNDC&nbsp;风格非常方便，你还是要小心使用，因为每个设备场景都使用系统资源的一部分。由于本例需要处理图形动画，私有的&nbsp;HDC&nbsp;是非常有用的，因为我们不需要在移动小球时成千上万次调用&nbsp;GetDC(&nbsp;)&nbsp;进行喷绘。<br>　　在&nbsp;DrawEdge(PaintS.hDC,&nbsp;ScrolRect1,&nbsp;EDGE_SUNKEN,&nbsp;BF_RECT);&nbsp;函数中使用&nbsp;WM_PAINT&nbsp;消息绘制了两个文本滚动框，这呈现了一个&nbsp;Windows&nbsp;系统控件（编辑框）的外观。如果你单击“开始滚动”按钮，ScrollText&nbsp;过程将被调用来创建文本滚动框的背景位图。TimeSetEvent(&nbsp;)&nbsp;和&nbsp;SetTimer(&nbsp;)&nbsp;将被调用，开始两个同样&nbsp;38&nbsp;毫秒时间间隔的计时器。SetTimer(&nbsp;)&nbsp;计时事件激活&nbsp;TimerProc&nbsp;在上面的文本滚动框上绘制一个新的矩形，TimeSetEvent(&nbsp;)&nbsp;计时事件激活&nbsp;MMTimerProc&nbsp;在下面的文本滚动框上绘制滚动文本。<br>　　更多信息请参看下面代码内的详细注释。<br><br>&nbsp;<br>program&nbsp;Timers;<br>{本程序使用三种不同的方法处理计时事件，这里没有使用&nbsp;SetTimer&nbsp;函数的&nbsp;WM_TIMER&nbsp;消息，<br>而是一个特定的&nbsp;TimerProc&nbsp;函数。本例还演示了多媒体计时的使用，它比&nbsp;SetTimer&nbsp;更加精<br>确。本例还演示了独立线程中使用&nbsp;SleepEx(&nbsp;)&nbsp;激活计时事件的例子。}<br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SmallUtils,&nbsp;mmsystem;<br>&nbsp;&nbsp;{mmsystem&nbsp;单元为多媒体计时器使用}<br>&nbsp;&nbsp;{$R&nbsp;*.RES}<br>type<br>&nbsp;&nbsp;ThreadRec&nbsp;=&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;Interval:&nbsp;Cardinal;<br>&nbsp;&nbsp;&nbsp;&nbsp;ID:&nbsp;Word;<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;wClass:&nbsp;TWndClass;<br>&nbsp;&nbsp;hForm1,&nbsp;hExitBut,&nbsp;hScrollBut,&nbsp;hSpriteBut,&nbsp;hPFlipBut,&nbsp;hThreadCB:&nbsp;THandle;<br>&nbsp;&nbsp;Font1,&nbsp;Brush1,&nbsp;Brush2,&nbsp;Brush3,&nbsp;Pen1,&nbsp;hThread:&nbsp;THandle;<br>&nbsp;&nbsp;SpriteBmp1,&nbsp;MaskBmp,&nbsp;FlipBmp,&nbsp;BkgndBmp:&nbsp;THandle;<br>&nbsp;&nbsp;mainMsg:&nbsp;TMSG;<br>&nbsp;&nbsp;Rect1,&nbsp;ScrolRect1,&nbsp;ScrolRect2:&nbsp;TRect;<br>&nbsp;&nbsp;FormDC,&nbsp;Bmp1DC,&nbsp;MaskDC,&nbsp;FlipDC,&nbsp;BkgndDC:&nbsp;HDC;<br>&nbsp;&nbsp;FontLog1:&nbsp;TLogFont;<br>&nbsp;&nbsp;DrawTimes:&nbsp;Byte;<br>&nbsp;&nbsp;Posit1,&nbsp;Posit2:&nbsp;Integer;<br>&nbsp;&nbsp;BrushLog1:&nbsp;TLogBrush;<br>&nbsp;&nbsp;Scrolling,&nbsp;GetPer,&nbsp;GetPer1,&nbsp;Moving,&nbsp;GoRight,&nbsp;GoDown,&nbsp;Fliping,&nbsp;thdTiming:&nbsp;Boolean;<br>&nbsp;&nbsp;Size1:&nbsp;TSize;<br>&nbsp;&nbsp;TimeCaps1:&nbsp;TTimeCaps;<br>&nbsp;&nbsp;TimerID1,&nbsp;TickCount:&nbsp;Cardinal;<br>&nbsp;&nbsp;PerFreq,&nbsp;PerCount0,&nbsp;PerCount1,&nbsp;PerCount2,&nbsp;PerCount3:&nbsp;Int64;<br>&nbsp;&nbsp;BallPoint:&nbsp;TPoint;<br>&nbsp;&nbsp;TimerR:&nbsp;ThreadRec;<br><br>const<br>&nbsp;&nbsp;Splash&nbsp;=&nbsp;&#39;Timers&#39;;<br>&nbsp;&nbsp;TextStr1&nbsp;=&nbsp;&#39;This&nbsp;is&nbsp;a&nbsp;WM_TIMER&nbsp;Scroll&#39;;<br>&nbsp;&nbsp;TextStr2&nbsp;=&nbsp;&#39;This&nbsp;is&nbsp;a&nbsp;MM&nbsp;Timer&nbsp;Scroll&#39;;<br><br>procedure&nbsp;ShutDown;<br>begin<br>&nbsp;&nbsp;KillTimer(hForm1,&nbsp;1);<br>&nbsp;&nbsp;KillTimer(hForm1,&nbsp;2);<br>&nbsp;&nbsp;KillTimer(hForm1,&nbsp;3);<br>&nbsp;&nbsp;KillTimer(hForm1,&nbsp;4);<br>&nbsp;&nbsp;{确保计时器销毁}<br>&nbsp;&nbsp;thdTiming&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;timeKillEvent(TimerID1);<br>&nbsp;&nbsp;TimeEndPeriod(TimeCaps1.wPeriodMin);<br>&nbsp;&nbsp;{确定在程序关闭前使用&nbsp;timeKillEvent&nbsp;和&nbsp;TimeEndPeriod&nbsp;}<br>&nbsp;&nbsp;CloseHandle(hThread);<br>&nbsp;&nbsp;{释放系统的线程句柄}<br>&nbsp;&nbsp;DeleteObject(Font1);<br>&nbsp;&nbsp;DeleteObject(Brush1);<br>&nbsp;&nbsp;DeleteObject(Brush2);<br>&nbsp;&nbsp;DeleteObject(Brush3);<br>&nbsp;&nbsp;DeleteObject(Pen1);<br>&nbsp;&nbsp;ReleaseDC(hForm1,&nbsp;FormDC);<br>&nbsp;&nbsp;DeleteDC(Bmp1DC);<br>&nbsp;&nbsp;DeleteDC(MaskDC);<br>&nbsp;&nbsp;DeleteDC(FlipDC);<br>&nbsp;&nbsp;DeleteDC(BkgndDC);<br>&nbsp;&nbsp;DeleteObject(SpriteBmp1);<br>&nbsp;&nbsp;DeleteObject(MaskBmp);<br>&nbsp;&nbsp;DeleteObject(FlipBmp);<br>&nbsp;&nbsp;DeleteObject(BkgndBmp);<br>&nbsp;&nbsp;PostQuitMessage(0);<br>end;<br><br>function&nbsp;MakeBrush(Color1,&nbsp;Color2:&nbsp;Cardinal):&nbsp;THandle;<br>var<br>&nbsp;&nbsp;BmpDC:&nbsp;hDC;<br>&nbsp;&nbsp;i,&nbsp;k,&nbsp;Dot:&nbsp;Integer;<br>&nbsp;&nbsp;Bitmap1:&nbsp;THandle;<br>&nbsp;&nbsp;TempDC:&nbsp;HDC;<br>begin<br>&nbsp;&nbsp;{这里使用两种颜色的画刷创建斜纹位图}<br>&nbsp;&nbsp;TempDC&nbsp;:=&nbsp;GetDC(0);<br>&nbsp;&nbsp;Bitmap1&nbsp;:=&nbsp;CreateCompatibleBitmap(TempDC,&nbsp;8,&nbsp;8);<br>&nbsp;&nbsp;BmpDC&nbsp;:=&nbsp;CreateCompatibleDC(TempDC);<br>&nbsp;&nbsp;ReleaseDC(GetDesktopWindow,&nbsp;TempDC);<br>&nbsp;&nbsp;SelectObject(BmpDC,&nbsp;Bitmap1);<br>&nbsp;&nbsp;Dot&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;7&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k&nbsp;:=&nbsp;0&nbsp;to&nbsp;7&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((k&nbsp;+&nbsp;Dot)&nbsp;mod&nbsp;4)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPixelV(BmpDC,&nbsp;i,&nbsp;k,&nbsp;Color1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPixelV(BmpDC,&nbsp;i,&nbsp;k,&nbsp;Color2);<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(Dot);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;BrushLog1.lbStyle&nbsp;:=&nbsp;BS_PATTERN;<br>&nbsp;&nbsp;BrushLog1.lbHatch&nbsp;:=&nbsp;Bitmap1;<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;CreateBrushIndirect(BrushLog1);<br>&nbsp;&nbsp;DeleteDC(BmpDC);<br>&nbsp;&nbsp;DeleteObject(Bitmap1);<br>end;<br><br>function&nbsp;MakeBrush3:&nbsp;THandle;<br>var<br>&nbsp;&nbsp;BmpDC:&nbsp;hDC;<br>&nbsp;&nbsp;Bitmap2:&nbsp;THandle;<br>&nbsp;&nbsp;i,&nbsp;k,&nbsp;Dot:&nbsp;Integer;<br>&nbsp;&nbsp;TempDC:&nbsp;HDC;<br>begin<br>&nbsp;&nbsp;{这里用黑白交互的画刷创建位图}<br>&nbsp;&nbsp;TempDC&nbsp;:=&nbsp;GetDC(0);<br>&nbsp;&nbsp;{这个函数在窗体之前调用，因此这里获取桌面&nbsp;hDC}<br>&nbsp;&nbsp;Bitmap2&nbsp;:=&nbsp;CreateBitmap(8,&nbsp;8,&nbsp;1,&nbsp;1,&nbsp;nil);<br>&nbsp;&nbsp;BmpDC&nbsp;:=&nbsp;CreateCompatibleDC(TempDC);<br>&nbsp;&nbsp;ReleaseDC(GetDesktopWindow,&nbsp;TempDC);<br>&nbsp;&nbsp;SelectObject(BmpDC,&nbsp;Bitmap2);<br>&nbsp;&nbsp;Dot&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;7&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k&nbsp;:=&nbsp;0&nbsp;to&nbsp;7&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((k&nbsp;+&nbsp;Dot)&nbsp;mod&nbsp;2)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPixelV(BmpDC,&nbsp;i,&nbsp;k,&nbsp;$00000000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPixelV(BmpDC,&nbsp;i,&nbsp;k,&nbsp;$00FFFFFF);<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(Dot);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;BrushLog1.lbStyle&nbsp;:=&nbsp;BS_PATTERN;<br>&nbsp;&nbsp;BrushLog1.lbHatch&nbsp;:=&nbsp;Bitmap2;<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;CreateBrushIndirect(BrushLog1);<br>&nbsp;&nbsp;DeleteDC(BmpDC);<br>&nbsp;&nbsp;DeleteObject(Bitmap2);<br>end;<br><br>procedure&nbsp;TimerProc(Wnd:&nbsp;HWnd;&nbsp;Mesg,&nbsp;TimerID,&nbsp;SysTime:&nbsp;Longint);&nbsp;stdcall;<br>var<br>&nbsp;&nbsp;TimeRec:&nbsp;TSystemTime;<br>&nbsp;&nbsp;Time:&nbsp;string;<br>&nbsp;&nbsp;OldColor:&nbsp;Cardinal;<br>&nbsp;&nbsp;OldMode:&nbsp;Integer;<br>&nbsp;&nbsp;OldFont:&nbsp;THandle;<br>begin<br>&nbsp;&nbsp;{如果函数地址在&nbsp;SetTimer(&nbsp;)&nbsp;给出的话，WM_TIMER&nbsp;消息将激活这个&nbsp;TimerProc&nbsp;函数。}<br>&nbsp;&nbsp;case&nbsp;TimerID&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{这里停止闪屏并显示主窗体}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(hForm1,&nbsp;1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(hForm1,&nbsp;2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(GetDesktopWindow,&nbsp;MaskDC);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MaskDC&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hForm1,&nbsp;SW_SHOWNORMAL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(hForm1,&nbsp;4,&nbsp;1000,&nbsp;@TimerProc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;//1<br>&nbsp;&nbsp;&nbsp;&nbsp;2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{这里喷绘闪屏，没有创建闪屏窗体，直接在桌面上绘制。&nbsp;使用&nbsp;DrawTimes&nbsp;来<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检测绘制哪个闪屏字母。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;DrawTimes&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(MaskDC,&nbsp;Rect1.Left&nbsp;+&nbsp;80,&nbsp;Rect1.Top&nbsp;+&nbsp;30,&nbsp;300,&nbsp;250,&nbsp;PATCOPY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;DrawTimes&nbsp;&lt;&nbsp;7&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(MaskDC,&nbsp;0,&nbsp;0,&nbsp;@Splash[DrawTimes],&nbsp;1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(MaskDC,&nbsp;Rect1.Left&nbsp;+&nbsp;80,&nbsp;Rect1.Top&nbsp;+&nbsp;30,&nbsp;300,&nbsp;250,&nbsp;DSTINVERT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(DrawTimes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;DrawTimes&nbsp;&gt;&nbsp;8&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(hForm1,&nbsp;2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;//2<br>&nbsp;&nbsp;&nbsp;&nbsp;3:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{这里绘制滚动文本}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{FormDC&nbsp;:=&nbsp;GetDC(hForm1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FormDC,&nbsp;Brush2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面三行不必使用，因为我们使用私有的设备场景&nbsp;FormDC}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetPer1&nbsp;and&nbsp;(PerFreq&nbsp;&lt;&gt;&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{性能计数器是一个高精度的计数器，它可以查出两次调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(&nbsp;)&nbsp;之间的时间间隔。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetPer1&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;OPAQUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;:=&nbsp;Int2Str(((PerCount3&nbsp;-&nbsp;PerCount2)&nbsp;*&nbsp;10000)&nbsp;div&nbsp;PerFreq);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Insert(&#39;.&#39;,&nbsp;Time,&nbsp;Length(Time));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;6,&nbsp;ScrolRect1.Top&nbsp;+&nbsp;6,&nbsp;PChar(Time),&nbsp;Length(Time));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{这将显示&nbsp;PerCount2&nbsp;和&nbsp;PerCount3&nbsp;之间的间隔毫秒数，它应该等于&nbsp;&nbsp;SetTimer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的时间间隔&nbsp;Interval&nbsp;，但是不管你设置低于&nbsp;55&nbsp;的任何数值，interval&nbsp;都将<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大约等于&nbsp;55&nbsp;，55&nbsp;毫秒是系统计时器能处理的最快间隔。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;:=&nbsp;&#39;&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Posit1&nbsp;&gt;&nbsp;Size1.cx&nbsp;+&nbsp;17&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{每次滚动循环&nbsp;Posit1&nbsp;都只会大于&nbsp;Size1.cx+17&nbsp;一次}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Posit1&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PerFreq&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetPer1&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InflateRect(ScrolRect1,&nbsp;-2,&nbsp;-2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(FormDC,&nbsp;ScrolRect1.Left,&nbsp;ScrolRect1.Top,&nbsp;196,&nbsp;26,&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExtTextOut(FormDC,&nbsp;ScrolRect1.Left&nbsp;-&nbsp;Posit1,&nbsp;ScrolRect1.Top&nbsp;+&nbsp;4,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ETO_CLIPPED,&nbsp;@ScrolRect1,&nbsp;TextStr1,&nbsp;25,&nbsp;nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ExtTextOut(&nbsp;)&nbsp;修整文本输出到&nbsp;ScrolRect1}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExtTextOut(FormDC,&nbsp;ScrolRect1.Right&nbsp;-&nbsp;Posit1,&nbsp;ScrolRect1.Top&nbsp;+&nbsp;4,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ETO_CLIPPED,&nbsp;@ScrolRect1,&nbsp;TextStr1,&nbsp;25,&nbsp;nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(Posit1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InflateRect(ScrolRect1,&nbsp;2,&nbsp;2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;//3<br>&nbsp;&nbsp;&nbsp;&nbsp;4:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{计时事件每秒激发一次，绘制本地时间到窗体上，就像一个时钟。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetLocalTime(TimeRec);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{为了获取日期和时间你可以使用&nbsp;GetLocalTime}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldFont&nbsp;:=&nbsp;SelectObject(FormDC,&nbsp;GetStockObject(ANSI_VAR_FONT));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldColor&nbsp;:=&nbsp;SetBkColor(FormDC,&nbsp;GetSysColor(COLOR_BTNFACE));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OldMode&nbsp;:=&nbsp;SetBkMode(FormDC,&nbsp;OPAQUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{由于私有的&nbsp;DC&nbsp;应用于该窗体，所有的&nbsp;DC&nbsp;对象和模式设置将会保留在&nbsp;FormDC&nbsp;，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;即使在这个函数以后。所以你需要记录你改变的&nbsp;DC&nbsp;设置用来还原它们。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;:=&nbsp;&#39;本地日期：&#39;&nbsp;+&nbsp;Int2Str(TimeRec.wMonth)&nbsp;+&nbsp;&#39;/&#39;&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Int2Str(TimeRec.wDay)&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;/&#39;&nbsp;+&nbsp;Int2Str(TimeRec.wYear)&nbsp;+&nbsp;&#39;&nbsp;&nbsp;&nbsp;&nbsp;时间：&#39;&nbsp;+&nbsp;Int2Str(TimeRec.wHour)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;:&#39;&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Int2Str(TimeRec.wMinute)&nbsp;+&nbsp;&#39;&nbsp;&nbsp;&#39;&nbsp;+&nbsp;Int2Str(TimeRec.wSecond)&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;&nbsp;秒&nbsp;&nbsp;&nbsp;&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;128,&nbsp;365,&nbsp;@Time[1],&nbsp;Length(Time));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{在绘制文本后复位&nbsp;FormDC&nbsp;设置，否则其他动画绘制操作将受到影响。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FormDC,&nbsp;OldFont);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetBkColor(FormDC,&nbsp;OldColor);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;OldMode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;:=&nbsp;&#39;&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;&nbsp;//&nbsp;case<br>end;<br><br>procedure&nbsp;MoveBall;<br>var<br>&nbsp;&nbsp;PCstr:&nbsp;string;<br>begin<br>&nbsp;&nbsp;{这里产生一个精灵动画（一个小球和阴影的图片），因此它在一个矩形范围移动，看起来<br>&nbsp;&nbsp;像是碰撞边缘。}<br>&nbsp;&nbsp;if&nbsp;GetPer&nbsp;and&nbsp;(PerFreq&nbsp;&lt;&gt;&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{这将显示该计时器的实际时间间隔，注意这是在多媒体或多线程计时器中设置的。}<br>&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount1);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetPer&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;OPAQUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;PCstr&nbsp;:=&nbsp;Int2Str(((PerCount1&nbsp;-&nbsp;PerCount0)&nbsp;*&nbsp;100000)&nbsp;div&nbsp;PerFreq);<br>&nbsp;&nbsp;&nbsp;&nbsp;Insert(&#39;.&#39;,&nbsp;PCstr,&nbsp;Length(PCstr)&nbsp;-&nbsp;1);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;460,&nbsp;120,&nbsp;PChar(PCstr),&nbsp;Length(PCstr));<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;SelectObject(FormDC,&nbsp;Brush1);<br>&nbsp;&nbsp;{SetROP2(FormDC,R2_COPYPEN);}<br>&nbsp;&nbsp;PatBlt(FormDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;49,&nbsp;44,&nbsp;PATCOPY);<br>&nbsp;&nbsp;{BallPoint&nbsp;用于记住小球的位置，GoRight&nbsp;和&nbsp;GoDown&nbsp;用于设置移动方向。}<br>&nbsp;&nbsp;if&nbsp;BallPoint.x&nbsp;&gt;&nbsp;366&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;GoRight&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PerFreq&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetPer&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else&nbsp;if&nbsp;BallPoint.x&nbsp;&lt;&nbsp;104&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;GoRight&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;{当位置到达最大值&nbsp;366&nbsp;和最小值&nbsp;104&nbsp;的时候改变小球的位置，正好对应矩形位置减去<br>&nbsp;&nbsp;精灵位图的宽度。}<br>&nbsp;&nbsp;if&nbsp;GoRight&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(BallPoint.x,&nbsp;5)<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;Dec(BallPoint.x,&nbsp;4);<br>&nbsp;&nbsp;{改变&nbsp;BallPoint&nbsp;的&nbsp;X&nbsp;和&nbsp;Y&nbsp;将会移动小球，你需要匹配像素与时间间隔来设置小球<br>&nbsp;&nbsp;移动的速度。}<br>&nbsp;&nbsp;if&nbsp;BallPoint.y&nbsp;&gt;&nbsp;213&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;GoDown&nbsp;:=&nbsp;False<br>&nbsp;&nbsp;else&nbsp;if&nbsp;BallPoint.y&nbsp;&lt;&nbsp;12&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;GoDown&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PerFreq&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetPer&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;GoDown&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(BallPoint.y,&nbsp;3)<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;Dec(BallPoint.y,&nbsp;2);<br>&nbsp;&nbsp;{电视使用每秒&nbsp;25&nbsp;帧的速度（时间间隔大约&nbsp;40&nbsp;毫秒）。你可以尝试保持动画间隔为<br>&nbsp;&nbsp;30&nbsp;到&nbsp;40&nbsp;毫秒之间并调整移动的像素累加值来获取你需要的速度。}<br>&nbsp;&nbsp;SelectObject(FormDC,&nbsp;Brush3);<br>&nbsp;&nbsp;{SetRop2&nbsp;为&nbsp;R2_MASKPEN&nbsp;并绘制椭圆，这样只有&nbsp;Brush3&nbsp;的黑色像素被绘制出一个阴影效果。}<br>&nbsp;&nbsp;Ellipse(FormDC,&nbsp;BallPoint.x&nbsp;+&nbsp;4,&nbsp;BallPoint.y&nbsp;+&nbsp;5,&nbsp;BallPoint.x&nbsp;+&nbsp;49,&nbsp;BallPoint.y&nbsp;+&nbsp;44);<br>&nbsp;&nbsp;{下面两个喷绘过程需要获取透明位图，第一个位图&nbsp;MaskBmp&nbsp;使用&nbsp;ScrAnd&nbsp;光栅操作符<br>&nbsp;&nbsp;绘制。后一个使用&nbsp;SrcInvert&nbsp;光栅操作符反色绘制&nbsp;Bmp1&nbsp;，因此颜色将会返回正常状<br>&nbsp;&nbsp;态，透明区域将会切换为&nbsp;hDC&nbsp;背景色。}<br>&nbsp;&nbsp;BitBlt(FormDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;40,&nbsp;40,&nbsp;MaskDC,&nbsp;0,&nbsp;0,&nbsp;SrcAnd);<br>&nbsp;&nbsp;BitBlt(FormDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;40,&nbsp;40,&nbsp;Bmp1DC,&nbsp;0,&nbsp;0,&nbsp;SrcInvert);<br>end;<br><br>procedure&nbsp;FlipIt;<br>var<br>&nbsp;&nbsp;RectP:&nbsp;TRect;<br>&nbsp;&nbsp;{Counts:&nbsp;Cardinal;}<br>begin<br>&nbsp;&nbsp;{如果你查看上面的&nbsp;MoveBall&nbsp;动画，你将发现小球有时会有所闪烁，如果背景绘制和<br>&nbsp;&nbsp;小球绘制使用不同的屏幕刷新速度，将会出现闪烁状态。在这个动画过程中使用了一种<br>&nbsp;&nbsp;被称作&nbsp;Page-Flipping&nbsp;的方法。不在屏幕上绘制新的背景和小球，而是在一个位图上<br>&nbsp;&nbsp;完成这个绘制工作，然后把整个位图喷绘到屏幕上，这样背景和小球绘制之间就没有刷<br>&nbsp;&nbsp;新，因此就没有闪烁了。然而，位图可能因为上面绘制动画精灵或者&nbsp;Scanline&nbsp;以及其<br>&nbsp;&nbsp;他图形操作变得很大，这样，绘制位图到屏幕上就会比动画时间间隔长一些，因此你可<br>&nbsp;&nbsp;以在&nbsp;Page-Flipping&nbsp;时做一点限制。}<br>&nbsp;&nbsp;if&nbsp;PerFreq&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount2);<br>&nbsp;&nbsp;BitBlt(FlipDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;49,&nbsp;47,&nbsp;BkgndDC,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;SrcCopy);<br>&nbsp;&nbsp;{通过复制&nbsp;BkgndBmp&nbsp;到上面擦除精灵}<br>&nbsp;&nbsp;if&nbsp;BallPoint.x&nbsp;&gt;&nbsp;240&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;GoRight&nbsp;:=&nbsp;False<br>&nbsp;&nbsp;else&nbsp;if&nbsp;BallPoint.x&nbsp;&lt;&nbsp;4&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;GoRight&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;if&nbsp;GoRight&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(BallPoint.x,&nbsp;5)<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;Dec(BallPoint.x,&nbsp;4);<br>&nbsp;&nbsp;if&nbsp;BallPoint.y&nbsp;&gt;&nbsp;196&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;GoDown&nbsp;:=&nbsp;False<br>&nbsp;&nbsp;else&nbsp;if&nbsp;BallPoint.y&nbsp;&lt;&nbsp;2&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;GoDown&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;if&nbsp;GoDown&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(BallPoint.y,&nbsp;3)<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;Dec(BallPoint.y,&nbsp;2);<br>&nbsp;&nbsp;{在&nbsp;FlipBmp&nbsp;上绘制新的精灵}<br>&nbsp;&nbsp;Ellipse(FlipDC,&nbsp;BallPoint.x&nbsp;+&nbsp;4,&nbsp;BallPoint.y&nbsp;+&nbsp;5,&nbsp;BallPoint.x&nbsp;+&nbsp;49,&nbsp;BallPoint.y&nbsp;+&nbsp;44);<br>&nbsp;&nbsp;BitBlt(FlipDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;40,&nbsp;40,&nbsp;MaskDC,&nbsp;0,&nbsp;0,&nbsp;SrcAnd);<br>&nbsp;&nbsp;BitBlt(FlipDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;40,&nbsp;40,&nbsp;Bmp1DC,&nbsp;0,&nbsp;0,&nbsp;SrcInvert);<br>&nbsp;&nbsp;BitBlt(FormDC,&nbsp;100,&nbsp;10,&nbsp;380,&nbsp;250,&nbsp;FlipDC,&nbsp;0,&nbsp;0,&nbsp;SrcCopy);<br>&nbsp;&nbsp;{现在整个&nbsp;FlipBmp&nbsp;被复制到&nbsp;FormDC&nbsp;而不是仅仅覆盖精灵的一小部分。因为只有一次<br>&nbsp;&nbsp;绘制操作，所以没有闪烁。}<br>&nbsp;&nbsp;if&nbsp;PerFreq&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{这将演示高性能计数来绘制位图以及绘制位图到窗体上。}<br>&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount3);<br>&nbsp;&nbsp;&nbsp;&nbsp;{Counts&nbsp;:=&nbsp;((PerCount3-PerCount2)*1000)&nbsp;div&nbsp;PerFreq;}<br>&nbsp;&nbsp;&nbsp;&nbsp;{为了获取毫秒级的时间，你需要用&nbsp;PerFreq&nbsp;整除，但是这个位图是足够小的，所以用<br>&nbsp;&nbsp;&nbsp;&nbsp;不了&nbsp;1&nbsp;毫秒时间。}<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;OPAQUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetRect(RectP,&nbsp;424,&nbsp;5,&nbsp;474,&nbsp;35);<br>&nbsp;&nbsp;&nbsp;&nbsp;FillRect(FormDC,&nbsp;RectP,&nbsp;wClass.hbrBackground);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;424,&nbsp;5,&nbsp;PChar(Int2Str({Counts}&nbsp;PerCount3&nbsp;-&nbsp;PerCount2)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length(Int2Str({Counts}&nbsp;PerCount3&nbsp;-&nbsp;PerCount2)));<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;ScrollIt;<br>var<br>&nbsp;&nbsp;Ticks:&nbsp;string;<br>begin<br>&nbsp;&nbsp;{这个动画显示文字，这样看上去就像文本从右向左移动。这与&nbsp;TimerProc&nbsp;的&nbsp;case&nbsp;3<br>&nbsp;&nbsp;一样滚动文本，这样你可以看出多媒体计时器与系统计时器动画的不同。}<br>&nbsp;&nbsp;{FormDC&nbsp;:=&nbsp;GetDC(hForm1);<br>&nbsp;&nbsp;SelectObject(FormDC,&nbsp;Brush2);<br>&nbsp;&nbsp;SetBkMode(FormDC,TRANSPARENT);}<br>&nbsp;&nbsp;{不需要使用上面的函数，因为这里在私有&nbsp;DC&nbsp;上绘制。}<br>&nbsp;&nbsp;if&nbsp;GetPer&nbsp;and&nbsp;(PerFreq&nbsp;&lt;&gt;&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{这将显示该计时器的实际时间间隔，注意这是在多媒体或多线程计时器中设置的。}<br>&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount1);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetPer&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;OPAQUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;ScrolRect2.Right&nbsp;+&nbsp;8,&nbsp;ScrolRect2.Top&nbsp;+&nbsp;6,&nbsp;PChar(&#39;Ticks&nbsp;&#39;&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Int2Str(GetTickCount&nbsp;-&nbsp;TickCount)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length(&#39;Ticks&nbsp;&#39;&nbsp;+&nbsp;Int2Str(GetTickCount&nbsp;-&nbsp;TickCount)));<br>&nbsp;&nbsp;&nbsp;&nbsp;Ticks&nbsp;:=&nbsp;Int2Str(((PerCount1&nbsp;-&nbsp;PerCount0)&nbsp;*&nbsp;10000)&nbsp;div&nbsp;PerFreq);<br>&nbsp;&nbsp;&nbsp;&nbsp;Insert(&#39;.&#39;,&nbsp;Ticks,&nbsp;Length(Ticks));<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;6,&nbsp;ScrolRect2.Top&nbsp;+&nbsp;6,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PChar(Ticks&nbsp;{Int2Str(((PerCount1-PerCount0)*1000)&nbsp;div&nbsp;PerFreq)}),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length(Ticks&nbsp;{Int2Str(((PerCount1-PerCount0)*&nbsp;1000)&nbsp;div&nbsp;PerFreq)}));<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;Ticks&nbsp;:=&nbsp;&#39;&#39;;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;Posit2&nbsp;&gt;&nbsp;Size1.cx&nbsp;+&nbsp;17&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Posit2&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PerFreq&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TickCount&nbsp;:=&nbsp;GetTickCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetPer&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;{Size1&nbsp;用于不同的文本&nbsp;TextStr1，然后在这里使用，但是它给出与&nbsp;TimerProc&nbsp;滚动<br>&nbsp;&nbsp;一样的宽度，这样便于对比。}&nbsp;&nbsp;<br>&nbsp;&nbsp;InflateRect(ScrolRect2,&nbsp;-2,&nbsp;-2);<br>&nbsp;&nbsp;BitBlt(FormDC,&nbsp;ScrolRect2.Left,&nbsp;ScrolRect2.Top,&nbsp;Size1.cx&nbsp;+&nbsp;17,<br>&nbsp;&nbsp;&nbsp;&nbsp;ScrolRect2.Bottom&nbsp;-&nbsp;ScrolRect2.Top,&nbsp;BkgndDC,&nbsp;Posit2,&nbsp;0,&nbsp;SrcCopy);<br>&nbsp;&nbsp;BitBlt(FormDC,&nbsp;ScrolRect2.Right&nbsp;-&nbsp;Posit2,&nbsp;ScrolRect2.Top,&nbsp;Posit2,<br>&nbsp;&nbsp;&nbsp;&nbsp;ScrolRect2.Bottom&nbsp;-&nbsp;ScrolRect2.Top,&nbsp;BkgndDC,&nbsp;0,&nbsp;0,&nbsp;SrcCopy);<br>&nbsp;&nbsp;{PatBlt(FormDC,&nbsp;ScrolRect2.Left,&nbsp;ScrolRect2.Top,&nbsp;196,&nbsp;26,PATCOPY);<br>&nbsp;&nbsp;ExtTextOut(FormDC,ScrolRect2.Left-Posit2,&nbsp;ScrolRect2.Top+4,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ETO_CLIPPED,&nbsp;@ScrolRect2,&nbsp;TextStr2,&nbsp;25,&nbsp;nil);<br>&nbsp;&nbsp;ExtTextOut(FormDC,ScrolRect2.Right-Posit2,&nbsp;ScrolRect2.Top+4,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ETO_CLIPPED,&nbsp;@ScrolRect2,&nbsp;TextStr2,&nbsp;25,&nbsp;nil);}<br>&nbsp;&nbsp;InflateRect(ScrolRect2,&nbsp;2,&nbsp;2);<br>&nbsp;&nbsp;{ReleaseDC(hForm1,&nbsp;FormDC);}<br>&nbsp;&nbsp;Inc(Posit2,&nbsp;2);<br>end;<br><br>procedure&nbsp;MMTimerProc(uTimerID,&nbsp;uMessage:&nbsp;cardinal;&nbsp;dwUser,&nbsp;dw1,&nbsp;dw2:&nbsp;integer);<br>&nbsp;&nbsp;stdcall;<br>begin<br>&nbsp;&nbsp;{你需要设置所有的操作到其他过程，这里除了调用这些过程外不要进行其他操作。这个<br>&nbsp;&nbsp;函数将被多媒体计时器事件调用，甚至是在过程被前一个尚未结束的&nbsp;MMTimerProc&nbsp;调用<br>&nbsp;&nbsp;的情况下。多媒体计时器工作于独立线程。}<br>&nbsp;&nbsp;case&nbsp;dwUser&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;MoveBall;<br>&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;FlipIt;<br>&nbsp;&nbsp;&nbsp;&nbsp;10:&nbsp;ScrollIt;<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;timeKillEvent(TimerID1);<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;ThreadFunc(Parameter:&nbsp;Pointer):&nbsp;Integer;&nbsp;stdcall;<br>begin<br>&nbsp;&nbsp;{你需要设置所有的操作到其他过程，这里除了调用这些过程外不要进行其他操作。这个<br>&nbsp;&nbsp;函数工作于独立线程，即使这个过程被前一个尚未结束的&nbsp;ThreadFunc&nbsp;调用的情况下也<br>&nbsp;&nbsp;可以被调用。}<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;while&nbsp;thdTiming&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{thdTiming&nbsp;暂停这个线程，它在&nbsp;while&nbsp;循环中使用&nbsp;SleepEx&nbsp;获得计时时间间隔的效果。}<br>&nbsp;&nbsp;&nbsp;&nbsp;SleepEx(TimerR.Interval,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TimerR.ID&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;if&nbsp;thdTiming&nbsp;then&nbsp;FlipIt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{检测&nbsp;thdTiming&nbsp;防止它在&nbsp;SleepEx&nbsp;时改变}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;if&nbsp;thdTiming&nbsp;then&nbsp;MoveBall;<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Break;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;TimerR.ID&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;EndThread(Result);<br>&nbsp;&nbsp;{ExitThread(Result);}<br>&nbsp;&nbsp;{EndThread&nbsp;下面的代码不会被执行}<br>&nbsp;&nbsp;TextOut(FormDC,&nbsp;4,&nbsp;100,&nbsp;&#39;在&nbsp;EndThread&nbsp;下面&#39;,&nbsp;17);<br>end;<br><br>procedure&nbsp;DoThreadTimer(Interval,&nbsp;TimerID:&nbsp;Word);<br>var<br>&nbsp;&nbsp;ThreadId:&nbsp;LongWord;<br>begin<br>&nbsp;&nbsp;{时间间隔应该大于&nbsp;4&nbsp;，否则要使用大量的进程时间周期，如果你使用小于&nbsp;5&nbsp;的时间间<br>&nbsp;&nbsp;隔，应该使用&nbsp;SetThreadPriority(&nbsp;)&nbsp;设置线程为最高优先级。}<br>&nbsp;&nbsp;if&nbsp;TimerR.ID&nbsp;&lt;&gt;&nbsp;0&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;{TimerR.ID&nbsp;在线程结束时被设置为&nbsp;0，检测是否为&nbsp;0&nbsp;确保如果进程在运行中则不开始。}<br>&nbsp;&nbsp;if&nbsp;Interval&nbsp;&lt;&nbsp;5<br>&nbsp;&nbsp;then&nbsp;TimerR.Interval&nbsp;:=&nbsp;5<br>&nbsp;&nbsp;else&nbsp;TimerR.Interval&nbsp;:=&nbsp;Interval;<br>&nbsp;&nbsp;TimerR.ID&nbsp;:=&nbsp;TimerID;<br>&nbsp;&nbsp;CloseHandle(hThread);<br>&nbsp;&nbsp;{由于线程可能不止一次被创建，所以你应该关闭句柄。如果你想使用多个线程，你应该<br>&nbsp;&nbsp;跟踪每个线程的句柄并关闭它。}<br>&nbsp;&nbsp;hThread&nbsp;:=&nbsp;BeginThread(nil,&nbsp;0,&nbsp;@ThreadFunc,&nbsp;nil,&nbsp;0,&nbsp;ThreadId);<br>&nbsp;&nbsp;{BeginThread(&nbsp;)&nbsp;是一个&nbsp;Delphi&nbsp;的系统函数，它与&nbsp;Windows&nbsp;的&nbsp;CreateThread(&nbsp;)&nbsp;函数<br>&nbsp;&nbsp;基本一样，只是它还设置了一个全局变量&nbsp;IsMultiThread&nbsp;，从而保证线程安全。下面是<br>&nbsp;&nbsp;CreateThread(&nbsp;)&nbsp;函数原型，一样可以使用。}<br>&nbsp;&nbsp;{hThread&nbsp;:=&nbsp;CreateThread(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NIL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;no&nbsp;security&nbsp;attributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;default&nbsp;stack&nbsp;size<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ThreadFunc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;thread&nbsp;function<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nil,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;argument&nbsp;to&nbsp;thread&nbsp;function<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;default&nbsp;creation&nbsp;flags<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadId);}<br>&nbsp;&nbsp;{SetThreadPriority(hThread,&nbsp;THREAD_PRIORITY_ABOVE_NORMAL);}<br>&nbsp;&nbsp;{使用&nbsp;EndThread(&nbsp;)&nbsp;对应&nbsp;BeginThread(&nbsp;)&nbsp;，使用&nbsp;ExitThread(&nbsp;)&nbsp;对应<br>&nbsp;&nbsp;CreateThread(&nbsp;)&nbsp;，参见上面的&nbsp;ThreadFunc(&nbsp;)&nbsp;部分。}<br>end;<br><br>procedure&nbsp;ScrollText;<br>var<br>&nbsp;&nbsp;Interval,&nbsp;Accur:&nbsp;Word;<br>begin<br>&nbsp;&nbsp;if&nbsp;Scrolling&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Scrolling&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;timeKillEvent(TimerID1);<br>&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(hForm1,&nbsp;3);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hSpriteBut,&nbsp;True);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hPFlipBut,&nbsp;True);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hThreadCB,&nbsp;True);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hScrollBut,&nbsp;&#39;开始滚动&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(BkgndDC);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(BkgndBmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(FormDC,&nbsp;ScrolRect1.Left&nbsp;+&nbsp;2,&nbsp;ScrolRect1.Top&nbsp;+&nbsp;2,&nbsp;196,&nbsp;26,&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(FormDC,&nbsp;ScrolRect2.Left&nbsp;+&nbsp;2,&nbsp;ScrolRect2.Top&nbsp;+&nbsp;2,&nbsp;196,&nbsp;26,&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;ScrolRect1.Left&nbsp;+&nbsp;4,&nbsp;ScrolRect1.Top&nbsp;+&nbsp;6,&nbsp;TextStr1,&nbsp;25);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;ScrolRect2.Left&nbsp;+&nbsp;4,&nbsp;ScrolRect2.Top&nbsp;+&nbsp;6,&nbsp;TextStr2,&nbsp;25);<br>&nbsp;&nbsp;&nbsp;&nbsp;Posit1&nbsp;:=&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;Posit2&nbsp;:=&nbsp;1;<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hSpriteBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hPFlipBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hThreadCB,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FormDC,&nbsp;Brush2);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;InflateRect(ScrolRect2,&nbsp;-2,&nbsp;-2);<br>&nbsp;&nbsp;&nbsp;&nbsp;BkgndBmp&nbsp;:=&nbsp;CreateCompatibleBitmap(FormDC,&nbsp;Size1.cx&nbsp;+&nbsp;17,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScrolRect2.Bottom&nbsp;-&nbsp;ScrolRect2.Top);<br>&nbsp;&nbsp;&nbsp;&nbsp;BkgndDC&nbsp;:=&nbsp;CreateCompatibleDC(FormDC);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(BkgndDC,&nbsp;BkgndBmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(BkgndDC,&nbsp;Brush2);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(BkgndDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(BkgndDC,&nbsp;0,&nbsp;0,&nbsp;Size1.cx&nbsp;+&nbsp;17,&nbsp;ScrolRect2.Bottom&nbsp;-&nbsp;ScrolRect2.Top,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(BkgndDC,&nbsp;3,&nbsp;4,&nbsp;TextStr2,&nbsp;25);<br>&nbsp;&nbsp;&nbsp;&nbsp;InflateRect(ScrolRect2,&nbsp;2,&nbsp;2);<br>&nbsp;&nbsp;&nbsp;&nbsp;timeKillEvent(TimerID1);<br>&nbsp;&nbsp;&nbsp;&nbsp;Interval&nbsp;:=&nbsp;38;<br>&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;Interval&nbsp;div&nbsp;2;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Accur&nbsp;&lt;&nbsp;TimeCaps1.wPeriodMin&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;TimeCaps1.wPeriodMin;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Accur&nbsp;&gt;&nbsp;TimeCaps1.wPeriodMax&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;TimeCaps1.wPeriodMax;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;TimeCaps1.wPeriodMin&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimerID1&nbsp;:=&nbsp;TimeSetEvent(Interval,&nbsp;Accur,&nbsp;@MMTimerProc,&nbsp;10,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIME_PERIODIC);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(hForm1,&nbsp;3,&nbsp;Interval,&nbsp;@TimerProc);<br>&nbsp;&nbsp;&nbsp;&nbsp;{注意多媒体计时器与系统计时器的时间间隔一样}<br>&nbsp;&nbsp;&nbsp;&nbsp;Scrolling&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hScrollBut,&nbsp;&#39;停止滚动&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;ScrolRect1.Left,&nbsp;ScrolRect1.Top&nbsp;-&nbsp;28,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PChar(&#39;文本滚动时间间隔为&nbsp;&#39;&nbsp;+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Int2Str(Interval)),&nbsp;19&nbsp;+&nbsp;Length(Int2Str(Interval)));<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;MakeMoveBall;<br>var<br>&nbsp;&nbsp;TDC:&nbsp;HDC;<br>&nbsp;&nbsp;TempBmp,&nbsp;TempBrush,&nbsp;TempPen:&nbsp;THandle;<br>begin<br>&nbsp;&nbsp;{这里创建一个位图动画精灵，它在圆周围添加一些高亮与暗影的弧形区域，这样看起来<br>&nbsp;&nbsp;就是一个&nbsp;3D&nbsp;的球体。}<br>&nbsp;&nbsp;Bmp1DC&nbsp;:=&nbsp;CreateCompatibleDC(FormDC);<br>&nbsp;&nbsp;MaskDC&nbsp;:=&nbsp;CreateCompatibleDC(FormDC);<br>&nbsp;&nbsp;TDC&nbsp;:=&nbsp;CreateCompatibleDC(FormDC);<br>&nbsp;&nbsp;SpriteBmp1&nbsp;:=&nbsp;CreateCompatibleBitmap(FormDC,&nbsp;40,&nbsp;40);<br>&nbsp;&nbsp;MaskBmp&nbsp;:=&nbsp;CreateCompatibleBitmap(FormDC,&nbsp;40,&nbsp;40);<br>&nbsp;&nbsp;{由于假定外观为一个球体，位图是不规则的，我们需要绘制透明的位图。为了完成这个<br>&nbsp;&nbsp;操作，我们需要使用覆盖位图，希望透明的区域为白色。}<br>&nbsp;&nbsp;TempBmp&nbsp;:=&nbsp;CreateCompatibleBitmap(FormDC,&nbsp;40,&nbsp;40);<br>&nbsp;&nbsp;{TempBmp&nbsp;将会得到反色，反色位图将复制到精灵位图。}<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;SpriteBmp1);<br>&nbsp;&nbsp;SelectObject(MaskDC,&nbsp;MaskBmp);<br>&nbsp;&nbsp;SelectObject(TDC,&nbsp;TempBmp);<br>&nbsp;&nbsp;SelectObject(MaskDC,&nbsp;GetStockObject(WHITE_BRUSH));<br>&nbsp;&nbsp;PatBlt(MaskDC,&nbsp;0,&nbsp;0,&nbsp;40,&nbsp;40,&nbsp;PATCOPY);<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;GetStockObject(WHITE_BRUSH));<br>&nbsp;&nbsp;PatBlt(Bmp1DC,&nbsp;0,&nbsp;0,&nbsp;40,&nbsp;40,&nbsp;PATCOPY);<br>&nbsp;&nbsp;SelectObject(MaskDC,&nbsp;GetStockObject(BLACK_BRUSH));<br>&nbsp;&nbsp;Ellipse(MaskDC,&nbsp;0,&nbsp;0,&nbsp;40,&nbsp;40);<br>&nbsp;&nbsp;TempBrush&nbsp;:=&nbsp;CreateSolidBrush($00AADD00);<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;TempBrush);<br>&nbsp;&nbsp;Ellipse(Bmp1DC,&nbsp;0,&nbsp;0,&nbsp;40,&nbsp;40);<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;GetStockObject(WHITE_BRUSH));<br>&nbsp;&nbsp;{白色画刷用于添加高亮}<br>&nbsp;&nbsp;PatBlt(Bmp1DC,&nbsp;10,&nbsp;8,&nbsp;5,&nbsp;5,&nbsp;PATCOPY);<br>&nbsp;&nbsp;TempPen&nbsp;:=&nbsp;CreatePen(PS_SOLID,&nbsp;1,&nbsp;$00669900);<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;TempPen);<br>&nbsp;&nbsp;{几个弧形区域使用黑色画笔绘制，为小球添加阴影效果。}<br>&nbsp;&nbsp;Arc(Bmp1DC,&nbsp;2,&nbsp;2,&nbsp;38,&nbsp;38,&nbsp;18,&nbsp;40,&nbsp;40,&nbsp;18);<br>&nbsp;&nbsp;DeleteObject(TempPen);<br>&nbsp;&nbsp;TempPen&nbsp;:=&nbsp;CreatePen(PS_SOLID,&nbsp;1,&nbsp;$0099AA00);<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;TempPen);<br>&nbsp;&nbsp;Arc(Bmp1DC,&nbsp;5,&nbsp;5,&nbsp;35,&nbsp;35,&nbsp;20,&nbsp;40,&nbsp;40,&nbsp;20);<br>&nbsp;&nbsp;DeleteObject(TempPen);<br>&nbsp;&nbsp;TempPen&nbsp;:=&nbsp;CreatePen(PS_SOLID,&nbsp;1,&nbsp;$0099BB00);<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;TempPen);<br>&nbsp;&nbsp;Arc(Bmp1DC,&nbsp;8,&nbsp;8,&nbsp;32,&nbsp;32,&nbsp;22,&nbsp;40,&nbsp;40,&nbsp;22);<br>&nbsp;&nbsp;DeleteObject(TempPen);<br>&nbsp;&nbsp;TempPen&nbsp;:=&nbsp;CreatePen(PS_SOLID,&nbsp;1,&nbsp;$00D2E4B4);<br>&nbsp;&nbsp;SelectObject(Bmp1DC,&nbsp;TempPen);<br>&nbsp;&nbsp;Arc(Bmp1DC,&nbsp;3,&nbsp;3,&nbsp;37,&nbsp;37,&nbsp;16,&nbsp;0,&nbsp;0,&nbsp;16);<br>&nbsp;&nbsp;BitBlt(TDC,&nbsp;0,&nbsp;0,&nbsp;40,&nbsp;40,&nbsp;MaskDC,&nbsp;0,&nbsp;0,&nbsp;SrcCopy);<br>&nbsp;&nbsp;BitBlt(TDC,&nbsp;0,&nbsp;0,&nbsp;40,&nbsp;40,&nbsp;Bmp1DC,&nbsp;0,&nbsp;0,&nbsp;SrcErase);<br>&nbsp;&nbsp;{为了获取透明位图效果，我们复制&nbsp;MaskDC&nbsp;到&nbsp;TDC&nbsp;，这样我们对&nbsp;Bmp1DC&nbsp;进行任何擦除<br>&nbsp;&nbsp;操作，将会反转&nbsp;Bmp1DC&nbsp;位图颜色。}<br>&nbsp;&nbsp;BitBlt(Bmp1DC,&nbsp;0,&nbsp;0,&nbsp;40,&nbsp;40,&nbsp;TDC,&nbsp;0,&nbsp;0,&nbsp;SrcCopy);<br>&nbsp;&nbsp;{临时的&nbsp;TDC&nbsp;反色球将复制到&nbsp;Bmp1DC}<br>&nbsp;&nbsp;DeleteDC(TDC);<br>&nbsp;&nbsp;DeleteObject(TempBmp);<br>&nbsp;&nbsp;DeleteObject(TempBrush);<br>&nbsp;&nbsp;DeleteObject(TempPen);<br>end;<br><br>procedure&nbsp;EndAnimation;<br>begin<br>&nbsp;&nbsp;thdTiming&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;timeKillEvent(TimerID1);<br>&nbsp;&nbsp;EnableWindow(hScrollBut,&nbsp;True);<br>&nbsp;&nbsp;EnableWindow(hPFlipBut,&nbsp;True);<br>&nbsp;&nbsp;EnableWindow(hThreadCB,&nbsp;True);<br>&nbsp;&nbsp;EnableWindow(hSpriteBut,&nbsp;True);<br>&nbsp;&nbsp;DeleteDC(Bmp1DC);<br>&nbsp;&nbsp;DeleteDC(MaskDC);<br>&nbsp;&nbsp;DeleteObject(SpriteBmp1);<br>&nbsp;&nbsp;DeleteObject(MaskBmp);<br>&nbsp;&nbsp;BallPoint.x&nbsp;:=&nbsp;150;<br>&nbsp;&nbsp;BallPoint.y&nbsp;:=&nbsp;100;<br>end;<br><br>procedure&nbsp;Animate;<br>var<br>&nbsp;&nbsp;Interval,&nbsp;Accur:&nbsp;Word;<br>begin<br>&nbsp;&nbsp;if&nbsp;Moving&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Moving&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;EndAnimation;<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hSpriteBut,&nbsp;&#39;开始移动&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;{SelectObject(TempDC,&nbsp;GetSysColorBrush(COLOR_BTNFACE));<br>&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(TempDC,&nbsp;100,&nbsp;10,&nbsp;320,&nbsp;250,PATCOPY);}<br>&nbsp;&nbsp;&nbsp;&nbsp;{ReleaseDC(hForm1,&nbsp;TempDC);}<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;timeKillEvent(TimerID1);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hScrollBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hPFlipBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hThreadCB,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hSpriteBut,&nbsp;&#39;停止移动&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;Moving&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount0);<br>&nbsp;&nbsp;&nbsp;&nbsp;{TempDC&nbsp;:=&nbsp;GetDC(hForm1);}<br>&nbsp;&nbsp;&nbsp;&nbsp;MakeMoveBall&nbsp;{(TempDC)};<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FormDC,&nbsp;Brush1);<br>&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(FormDC,&nbsp;100,&nbsp;10,&nbsp;320,&nbsp;250,&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;{SetBkMode(TempDC,&nbsp;TRANSPARENT);}<br>&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(FormDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;40,&nbsp;40,&nbsp;MaskDC,&nbsp;0,&nbsp;0,&nbsp;SrcAnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(FormDC,&nbsp;BallPoint.x,&nbsp;BallPoint.y,&nbsp;40,&nbsp;40,&nbsp;Bmp1DC,&nbsp;0,&nbsp;0,&nbsp;SrcInvert);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FormDC,&nbsp;GetStockObject(NULL_PEN));<br>&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount1);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;OPAQUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;35,&nbsp;5,&nbsp;PChar(Int2Str(PerCount1&nbsp;-&nbsp;PerCount0)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length(Int2Str({(}(PerCount1&nbsp;-&nbsp;PerCount0)&nbsp;{*&nbsp;1000)&nbsp;div&nbsp;PerFreq})));<br>&nbsp;&nbsp;&nbsp;&nbsp;Interval&nbsp;:=&nbsp;27;<br>&nbsp;&nbsp;&nbsp;&nbsp;{缩短时间间隔可以提高移动速度，但是会增加处理时间。你应该增加像素位置的改变量<br>&nbsp;&nbsp;&nbsp;&nbsp;来提高移动速度，如果时间间隔低于&nbsp;30&nbsp;则提高时间间隔。}<br>&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;Interval&nbsp;div&nbsp;2;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Accur&nbsp;&lt;&nbsp;TimeCaps1.wPeriodMin&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;TimeCaps1.wPeriodMin;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Accur&nbsp;&gt;&nbsp;TimeCaps1.wPeriodMax&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;TimeCaps1.wPeriodMax;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;SendMessage(hThreadCB,&nbsp;BM_GETSTATE,&nbsp;0,&nbsp;0)&nbsp;=&nbsp;BST_CHECKED&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Interval&nbsp;:=&nbsp;18;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thdTiming&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoThreadTimer(Interval,&nbsp;2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{12&nbsp;毫秒低于你应该使用的时间间隔，你应该使用&nbsp;2&nbsp;倍的时间&nbsp;24&nbsp;毫秒，同时双倍<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你移动的像素位置，由<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(BallPoint.x,5)&nbsp;else&nbsp;Dec(BallPoint.x,4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改变为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(BallPoint.x,10)&nbsp;else&nbsp;Dec(BallPoint.x,8);}<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;TimeCaps1.wPeriodMin&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimerID1&nbsp;:=&nbsp;TimeSetEvent(Interval,&nbsp;Accur,&nbsp;@MMTimerProc,&nbsp;1,&nbsp;TIME_PERIODIC);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;430,&nbsp;92,&nbsp;PChar(&#39;移动的时间间隔为&nbsp;&#39;+&nbsp;Int2Str(Interval)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17&nbsp;+&nbsp;Length(Int2Str(Interval)));<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;{SetRop2&nbsp;设置为&nbsp;R2_MASKPEN&nbsp;，这样将在&nbsp;MoveBall&nbsp;中绘制圆，只有&nbsp;Brush3&nbsp;的黑色<br>&nbsp;&nbsp;&nbsp;&nbsp;像素被绘制，从而得到阴影效果。}<br>&nbsp;&nbsp;&nbsp;&nbsp;SetROP2(FormDC,&nbsp;R2_MASKPEN);<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;PageFlip;<br>var<br>&nbsp;&nbsp;TempBrush:&nbsp;THandle;<br>&nbsp;&nbsp;Interval,&nbsp;Accur:&nbsp;Word;<br>begin<br>&nbsp;&nbsp;if&nbsp;Fliping&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Fliping&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;EndAnimation;<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hPFlipBut,&nbsp;&#39;PageFlip&nbsp;移动&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(FlipDC);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(BkgndDC);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(FlipBmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(BkgndBmp);<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hScrollBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hSpriteBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hThreadCB,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;Fliping&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hPFlipBut,&nbsp;&#39;停止&nbsp;Flip&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FormDC,&nbsp;GetSysColorBrush(COLOR_BTNFACE));<br>&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(FormDC,&nbsp;100,&nbsp;10,&nbsp;320,&nbsp;250,&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;MakeMoveBall;<br>&nbsp;&nbsp;&nbsp;&nbsp;BkgndBmp&nbsp;:=&nbsp;CreateCompatibleBitmap(FormDC,&nbsp;280,&nbsp;240);<br>&nbsp;&nbsp;&nbsp;&nbsp;BkgndDC&nbsp;:=&nbsp;CreateCompatibleDC(FormDC);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(BkgndDC,&nbsp;BkgndBmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(BkgndDC,&nbsp;Brush2);<br>&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(BkgndDC,&nbsp;0,&nbsp;0,&nbsp;280,&nbsp;240,&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(BkgndDC,&nbsp;Font1);<br>&nbsp;&nbsp;&nbsp;&nbsp;TempBrush&nbsp;:=&nbsp;CreateSolidBrush($00FF0000);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(BkgndDC,&nbsp;TempBrush);<br>&nbsp;&nbsp;&nbsp;&nbsp;Ellipse(BkgndDC,&nbsp;10,&nbsp;30,&nbsp;270,&nbsp;210);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(TempBrush);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(BkgndDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(BkgndDC,&nbsp;17,&nbsp;70,&nbsp;&#39;Page&nbsp;Flip&#39;,&nbsp;9);<br>&nbsp;&nbsp;&nbsp;&nbsp;FlipBmp&nbsp;:=&nbsp;CreateCompatibleBitmap(FormDC,&nbsp;280,&nbsp;240);<br>&nbsp;&nbsp;&nbsp;&nbsp;FlipDC&nbsp;:=&nbsp;CreateCompatibleDC(FormDC);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FlipDC,&nbsp;FlipBmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(FlipDC,&nbsp;0,&nbsp;0,&nbsp;280,&nbsp;240,&nbsp;BkgndDC,&nbsp;0,&nbsp;0,&nbsp;SrcCopy);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FlipDC,&nbsp;Brush3);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(FlipDC,&nbsp;GetStockObject(NULL_PEN));<br>&nbsp;&nbsp;&nbsp;&nbsp;SetROP2(FlipDC,&nbsp;R2_MASKPEN);<br>&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(PerCount1);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;OPAQUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;35,&nbsp;5,&nbsp;PChar(Int2Str(PerCount1&nbsp;-&nbsp;PerCount0)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length(Int2Str(((PerCount1&nbsp;-&nbsp;PerCount0)&nbsp;*&nbsp;1000)&nbsp;div&nbsp;PerFreq)));<br>&nbsp;&nbsp;&nbsp;&nbsp;Interval&nbsp;:=&nbsp;24;<br>&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;Interval&nbsp;div&nbsp;2;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Accur&nbsp;&lt;&nbsp;TimeCaps1.wPeriodMin&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;TimeCaps1.wPeriodMin;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Accur&nbsp;&gt;&nbsp;TimeCaps1.wPeriodMax&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accur&nbsp;:=&nbsp;TimeCaps1.wPeriodMax;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;SendMessage(hThreadCB,&nbsp;BM_GETSTATE,&nbsp;0,&nbsp;0)&nbsp;=&nbsp;BST_CHECKED&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Interval&nbsp;:=&nbsp;34;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thdTiming&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoThreadTimer(Interval,&nbsp;1);<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;TimeCaps1.wPeriodMin&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimerID1&nbsp;:=&nbsp;TimeSetEvent(Interval,&nbsp;Accur,&nbsp;@MMTimerProc,&nbsp;2,&nbsp;TIME_PERIODIC);<br>&nbsp;&nbsp;&nbsp;&nbsp;TextOut(FormDC,&nbsp;430,&nbsp;70,&nbsp;PChar(&#39;Flip的时间间隔为&nbsp;&#39;&nbsp;+&nbsp;Int2Str(Interval)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17&nbsp;+&nbsp;Length(Int2Str(Interval)));<br>&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(FormDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;MessageProc(hWnd:&nbsp;HWnd;&nbsp;Msg:&nbsp;UINT;&nbsp;WParam:&nbsp;WPARAM;&nbsp;LParam:&nbsp;LPARAM):<br>&nbsp;&nbsp;UINT;&nbsp;stdcall;<br>var<br>&nbsp;&nbsp;PaintS:&nbsp;TPaintStruct;<br>begin<br>&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_PAINT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeginPaint(hWnd,&nbsp;PaintS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawEdge(PaintS.hDC,&nbsp;ScrolRect1,&nbsp;EDGE_SUNKEN,&nbsp;BF_RECT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{滚动文本框需要一个凹陷的边缘，这样看起来像是&nbsp;Windows&nbsp;控件。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawEdge(PaintS.hDC,&nbsp;ScrolRect2,&nbsp;EDGE_SUNKEN,&nbsp;BF_RECT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(PaintS.hDC,&nbsp;6,&nbsp;202,&nbsp;PChar(&#39;PerFreq=&#39;&nbsp;+&nbsp;Int2Str(PerFreq)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;+&nbsp;Length(Int2Str(PerFreq)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Scrolling&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(PaintS.hDC,&nbsp;Brush2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetBkMode(PaintS.hDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(PaintS.hDC,&nbsp;ScrolRect1.Left&nbsp;+&nbsp;2,&nbsp;ScrolRect1.Top&nbsp;+&nbsp;2,&nbsp;196,&nbsp;26,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(PaintS.hDC,&nbsp;ScrolRect2.Left&nbsp;+&nbsp;2,&nbsp;ScrolRect2.Top&nbsp;+&nbsp;2,&nbsp;196,&nbsp;26,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(PaintS.hDC,&nbsp;ScrolRect1.Left&nbsp;+&nbsp;4,&nbsp;ScrolRect1.Top&nbsp;+&nbsp;6,&nbsp;TextStr1,&nbsp;25);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(PaintS.hDC,&nbsp;ScrolRect2.Left&nbsp;+&nbsp;4,&nbsp;ScrolRect2.Top&nbsp;+&nbsp;6,&nbsp;TextStr2,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Moving&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(PaintS.hDC,&nbsp;Brush1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatBlt(PaintS.hDC,&nbsp;100,&nbsp;10,&nbsp;320,&nbsp;250,&nbsp;PATCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndPaint(hWnd,&nbsp;PaintS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_COMMAND:&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hExitBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMessage(hForm1,&nbsp;WM_CLOSE,&nbsp;0,&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hScrollBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScrollText<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hSpriteBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Animate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hPFlipBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PageFlip;<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_DESTROY:&nbsp;ShutDown;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;DefWindowProc(hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam);<br>end;<br><br>begin&nbsp;//&nbsp;主程序开始&nbsp;//<br>&nbsp;&nbsp;DrawTimes&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;Scrolling&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;GetPer&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;GetPer1&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;Moving&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;Fliping&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;GoRight&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;GoDown&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;thdTiming&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;BallPoint.x&nbsp;:=&nbsp;150;<br>&nbsp;&nbsp;BallPoint.y&nbsp;:=&nbsp;100;<br>&nbsp;&nbsp;Posit1&nbsp;:=&nbsp;1;<br>&nbsp;&nbsp;Posit2&nbsp;:=&nbsp;1;<br>&nbsp;&nbsp;TimerID1&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;TimerR.ID&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;hThread&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;SetRect(ScrolRect1,&nbsp;40,&nbsp;276,&nbsp;240,&nbsp;306);<br>&nbsp;&nbsp;SetRect(ScrolRect2,&nbsp;40,&nbsp;316,&nbsp;240,&nbsp;346);<br>&nbsp;&nbsp;{ScrolRect1&nbsp;和&nbsp;ScrolRect2&nbsp;用于绘制文本滚动框}<br>&nbsp;&nbsp;Brush1&nbsp;:=&nbsp;MakeBrush($003366FF,&nbsp;$00FFFFFF);<br>&nbsp;&nbsp;Brush2&nbsp;:=&nbsp;MakeBrush($00EEF0FF,&nbsp;$0033E0EF);<br>&nbsp;&nbsp;Brush3&nbsp;:=&nbsp;MakeBrush3;<br>&nbsp;&nbsp;Pen1&nbsp;:=&nbsp;CreatePen(PS_SOLID,&nbsp;4,&nbsp;$00990099);<br>&nbsp;&nbsp;with&nbsp;FontLog1&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;lfHeight&nbsp;:=&nbsp;-60;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfWidth&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfItalic&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfWeight&nbsp;:=&nbsp;FW_NORMAL;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfCharSet&nbsp;:=&nbsp;ANSI_CHARSET;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfOutPrecision&nbsp;:=&nbsp;OUT_TT_PRECIS;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfClipPrecision&nbsp;:=&nbsp;CLIP_DEFAULT_PRECIS;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfQuality&nbsp;:=&nbsp;ANTIALIASED_QUALITY;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfPitchAndFamily&nbsp;:=&nbsp;VARIABLE_PITCH&nbsp;or&nbsp;FF_SWISS;<br>&nbsp;&nbsp;&nbsp;&nbsp;lfFaceName&nbsp;:=&nbsp;&#39;Comic&nbsp;Sans&nbsp;MS&#39;;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Font1&nbsp;:=&nbsp;CreateFontIndirect(FontLog1);<br><br>&nbsp;&nbsp;wClass.hInstance&nbsp;:=&nbsp;hInstance;<br>&nbsp;&nbsp;with&nbsp;wClass&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Style&nbsp;:=&nbsp;CS_BYTEALIGNCLIENT&nbsp;or&nbsp;CS_OWNDC;<br>&nbsp;&nbsp;&nbsp;&nbsp;{由于设置为&nbsp;CS_OWNDC&nbsp;风格，这将使得&nbsp;Form1&nbsp;窗口拥有一个私有的设备场景&nbsp;hDC&nbsp;。<br>&nbsp;&nbsp;&nbsp;&nbsp;使用这个风格是因为动画使用快速绘制，这样每次动画精灵喷绘是不需要反复使用<br>&nbsp;&nbsp;&nbsp;&nbsp;GetDC&nbsp;和&nbsp;ReleaseDC&nbsp;。}<br>&nbsp;&nbsp;&nbsp;&nbsp;hIcon&nbsp;:=&nbsp;LoadIcon(hInstance,&nbsp;&#39;MAINICON&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;lpfnWndProc&nbsp;:=&nbsp;@MessageProc;<br>&nbsp;&nbsp;&nbsp;&nbsp;hbrBackground&nbsp;:=&nbsp;COLOR_BTNFACE&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpszClassName&nbsp;:=&nbsp;&#39;Form&nbsp;Class&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;hCursor&nbsp;:=&nbsp;LoadCursor(0,&nbsp;IDC_ARROW);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;RegisterClass(wClass);<br><br>&nbsp;&nbsp;SetRect(Rect1,&nbsp;0,&nbsp;0,&nbsp;574,&nbsp;394);<br>&nbsp;&nbsp;if&nbsp;not&nbsp;AdjustWindowRect(Rect1,&nbsp;WS_CAPTION&nbsp;or&nbsp;WS_MINIMIZEBOX&nbsp;or&nbsp;WS_SYSMENU,<br>&nbsp;&nbsp;&nbsp;&nbsp;False)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;SetRect(Rect1,&nbsp;0,&nbsp;0,&nbsp;580,&nbsp;420);<br><br>&nbsp;&nbsp;hForm1&nbsp;:=&nbsp;CreateWindow(wClass.lpszClassName,&nbsp;&#39;&nbsp;更多计时器&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_CAPTION&nbsp;or&nbsp;WS_MINIMIZEBOX&nbsp;or&nbsp;WS_SYSMENU,<br>&nbsp;&nbsp;&nbsp;&nbsp;(GetSystemMetrics(SM_CXSCREEN)&nbsp;div&nbsp;2)&nbsp;-&nbsp;276,<br>&nbsp;&nbsp;&nbsp;&nbsp;(GetSystemMetrics(SM_CYSCREEN)&nbsp;div&nbsp;2)&nbsp;-&nbsp;222,<br>&nbsp;&nbsp;&nbsp;&nbsp;Rect1.Right&nbsp;-&nbsp;Rect1.Left,&nbsp;Rect1.Bottom&nbsp;-&nbsp;Rect1.Top,&nbsp;0,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;FormDC&nbsp;:=&nbsp;GetDC(hForm1);<br>&nbsp;&nbsp;{默认的&nbsp;hDC&nbsp;字体将被用于绘制文本滚动框}<br>&nbsp;&nbsp;GetTextExtentPoint32(FormDC,&nbsp;TextStr1,&nbsp;25,&nbsp;Size1);<br>&nbsp;&nbsp;{由于窗口类使用&nbsp;CS_OWNDC&nbsp;风格，使用&nbsp;ReleaseDC(hForm1,&nbsp;FormDC);&nbsp;无效}<br><br>&nbsp;&nbsp;hExitBut&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;退出&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_PUSHBUTTON&nbsp;or&nbsp;BS_TEXT,<br>&nbsp;&nbsp;&nbsp;&nbsp;484,&nbsp;360,&nbsp;74,&nbsp;24,&nbsp;hForm1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;hScrollBut&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;开始滚动&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_PUSHBUTTON&nbsp;or&nbsp;BS_TEXT,<br>&nbsp;&nbsp;&nbsp;&nbsp;20,&nbsp;360,&nbsp;78,&nbsp;24,&nbsp;hForm1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br>&nbsp;&nbsp;SendMessage(hScrollBut,&nbsp;WM_SETFONT,&nbsp;GetStockObject(ANSI_VAR_FONT),&nbsp;0);<br><br>&nbsp;&nbsp;hSpriteBut&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;开始移动&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_PUSHBUTTON&nbsp;or&nbsp;BS_TEXT,<br>&nbsp;&nbsp;&nbsp;&nbsp;310,&nbsp;290,&nbsp;78,&nbsp;24,&nbsp;hForm1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br>&nbsp;&nbsp;SendMessage(hSpriteBut,&nbsp;WM_SETFONT,&nbsp;GetStockObject(ANSI_VAR_FONT),&nbsp;0);<br><br>&nbsp;&nbsp;hPFlipBut&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;PageFlip&nbsp;移动&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_PUSHBUTTON&nbsp;or&nbsp;BS_TEXT,<br>&nbsp;&nbsp;&nbsp;&nbsp;420,&nbsp;290,&nbsp;86,&nbsp;24,&nbsp;hForm1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br>&nbsp;&nbsp;SendMessage(hPFlipBut,&nbsp;WM_SETFONT,&nbsp;GetStockObject(ANSI_VAR_FONT),&nbsp;0);<br><br>&nbsp;&nbsp;hThreadCB&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&#39;多线程计时器&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_CHILD&nbsp;or&nbsp;BS_AUTOCHECKBOX&nbsp;or&nbsp;WS_VISIBLE,<br>&nbsp;&nbsp;&nbsp;&nbsp;350,&nbsp;320,&nbsp;150,&nbsp;24,&nbsp;hForm1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br>&nbsp;&nbsp;SendMessage(hThreadCB,&nbsp;WM_SETFONT,&nbsp;GetStockObject(ANSI_VAR_FONT),&nbsp;0);<br><br>&nbsp;&nbsp;if&nbsp;TimeGetDevCaps(@TimeCaps1,&nbsp;sizeof(TimeCaps1))&nbsp;=&nbsp;TIMERR_NOERROR&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;TimeBeginPeriod(TimeCaps1.wPeriodMin)<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;TimeCaps1.wPeriodMin&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;{上面两行的&nbsp;TimeGetDevCaps&nbsp;和&nbsp;TimeBeginPeriod&nbsp;都是必须的，用于设置多媒体计时<br>&nbsp;&nbsp;器，这比使用&nbsp;SetTimer&nbsp;绘制移动动画精灵效果更好。}<br>&nbsp;&nbsp;if&nbsp;not&nbsp;QueryPerformanceFrequency(PerFreq)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;PerFreq&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;{QueryPerformanceFrequency&nbsp;获得每秒高性能计数器统计的数目，它可以每秒超过百万次。}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;GetWindowRect(hForm1,&nbsp;Rect1);<br>&nbsp;&nbsp;MaskDC&nbsp;:=&nbsp;GetDC(0);<br>&nbsp;&nbsp;{本程序直接在桌面上绘制闪屏，最好不直接在桌面上绘制，这里是为了演示你可以在桌面<br>&nbsp;&nbsp;上绘制，但是你应该创建一个闪屏窗体来绘制。}<br>&nbsp;&nbsp;SelectObject(MaskDC,&nbsp;Font1);<br>&nbsp;&nbsp;SetTextColor(MaskDC,&nbsp;$003366FF);<br>&nbsp;&nbsp;SetBkColor(MaskDC,&nbsp;$00DDEE33);<br>&nbsp;&nbsp;SetTextCharacterExtra(MaskDC,&nbsp;8);<br>&nbsp;&nbsp;SetTextAlign(MaskDC,&nbsp;TA_UPDATECP);<br>&nbsp;&nbsp;MoveToEx(MaskDC,&nbsp;Rect1.Left&nbsp;+&nbsp;106,&nbsp;Rect1.Top&nbsp;+&nbsp;108,&nbsp;nil);<br>&nbsp;&nbsp;SelectObject(MaskDC,&nbsp;Pen1);<br>&nbsp;&nbsp;SelectObject(MaskDC,&nbsp;GetStockObject(NULL_BRUSH));<br>&nbsp;&nbsp;Rectangle(MaskDC,&nbsp;Rect1.Left&nbsp;+78,&nbsp;Rect1.Top&nbsp;+28,&nbsp;Rect1.Left&nbsp;+383,&nbsp;Rect1.Top&nbsp;+283);<br>&nbsp;&nbsp;SelectObject(MaskDC,&nbsp;Brush1);<br>&nbsp;&nbsp;{两个计时器开始工作，第二个将逐步绘制文本作为闪屏，第一个将结束闪屏并显示主窗体。}<br>&nbsp;&nbsp;SetTimer(hForm1,&nbsp;2,&nbsp;330,&nbsp;@TimerProc);<br>&nbsp;&nbsp;SetTimer(hForm1,&nbsp;1,&nbsp;4500,&nbsp;@TimerProc);<br><br>&nbsp;&nbsp;while&nbsp;GetMessage(mainMsg,&nbsp;0,&nbsp;0,&nbsp;0)&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(mainMsg);<br>&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(mainMsg);<br>&nbsp;&nbsp;end;<br>end.<br><br>&nbsp;<br>]]></description></item><item><link>http://wang.minidns.net/blogview.asp?logID=158</link><title><![CDATA[DelphiZeus 11. 一个使用列表框的消息发送程序]]></title><author>wjiachun</author><category>技术档</category><pubDate>2008-6-27 16:50:46</pubDate><guid>http://wang.minidns.net/blogview.asp?logID=158</guid><description><![CDATA[<a target="_blank" href="blogview.asp?logID=145">返回首页</a><br><br>　　本程序是一个通知记录程序，源码保存于&nbsp;postNote.dpr&nbsp;文件，它产生一个黄色便笺式无标题主窗体。&nbsp;窗体内显示几条通知，这些通知可以使用右键弹出菜单进行修改。主窗体的尺寸随着显示通知的条数而变化，这些都通过&nbsp;.INI&nbsp;文件读取。<br><br>有待完善……&nbsp;&nbsp;<br><br>program&nbsp;postNote;<br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;commctrl,&nbsp;Shellapi,&nbsp;smallUtils;<br>&nbsp;&nbsp;{CommCtrl&nbsp;单元用于上下箭头按钮，ShellApi&nbsp;单元用于托盘图标}<br>&nbsp;&nbsp;{$R&nbsp;*.RES}<br>var<br>&nbsp;&nbsp;wClass,&nbsp;adClass:&nbsp;TWndClass;<br>&nbsp;&nbsp;hNoteHandle,&nbsp;Font1,&nbsp;Font2,&nbsp;Font3,&nbsp;Font4,&nbsp;hAdHandle,&nbsp;hOkBut,&nbsp;hAddBut,&nbsp;hAddABut,hDeleteBut,<br>&nbsp;&nbsp;&nbsp;&nbsp;hLabel1,&nbsp;hEdit1,&nbsp;hUpDown1,&nbsp;hEdit2,&nbsp;hGroup1,&nbsp;hListBox1,&nbsp;hUpdateBut,&nbsp;hHideBut,hPanel1,<br>&nbsp;&nbsp;&nbsp;&nbsp;hDelSelBut,&nbsp;hLabel2,&nbsp;hLabel3,&nbsp;hNoChangeBut,&nbsp;hIcon1,&nbsp;hCloseBut,&nbsp;hMinBut,<br>&nbsp;&nbsp;&nbsp;&nbsp;hRBStand,&nbsp;hRBYellow:&nbsp;HWND;<br>&nbsp;&nbsp;Msg:&nbsp;TMSG;<br>&nbsp;&nbsp;Brush1:&nbsp;HBRUSH;<br>&nbsp;&nbsp;IniName,&nbsp;ButtonChar:&nbsp;PChar;<br>&nbsp;&nbsp;CharBuffer:&nbsp;array[0..255]&nbsp;of&nbsp;Char;<br>&nbsp;&nbsp;{这里使用长度&nbsp;255&nbsp;的数组，远远能够满足需要。大部分指导手册告诉你要获取字符串长度，<br>&nbsp;&nbsp;但是如果你知道比创建的数组还大的最大长度，你就可以使用几种不同的调用方法。如果你<br>&nbsp;&nbsp;使用数组较小，你忽略数组大小之外的字符即可。}<br>&nbsp;&nbsp;j,&nbsp;Top,&nbsp;Left,&nbsp;NoteNum,&nbsp;Position,&nbsp;appWidth,&nbsp;FontSize,&nbsp;EditAdj,&nbsp;EditHgt:<br>&nbsp;&nbsp;Integer;<br>&nbsp;&nbsp;NoteList:&nbsp;array[0..25]&nbsp;of&nbsp;string;<br>&nbsp;&nbsp;{NoteList&nbsp;为&nbsp;[0..25]&nbsp;而不是&nbsp;[0..23]，这样允许复制}<br>&nbsp;&nbsp;Rect1:&nbsp;TRect;<br>&nbsp;&nbsp;Size1:&nbsp;TSize;<br>&nbsp;&nbsp;IconData:&nbsp;TNotifyIconData;<br>&nbsp;&nbsp;PGroup1Proc,&nbsp;PListBox1Proc,&nbsp;PPanel1Proc:&nbsp;Pointer;<br>&nbsp;&nbsp;DoChange,&nbsp;IsMar:&nbsp;Boolean;<br>&nbsp;&nbsp;UpSelect,&nbsp;DownSelect:&nbsp;Byte;<br>&nbsp;&nbsp;LogFont1:&nbsp;TLogFont;<br>const<br>&nbsp;&nbsp;PostNotes&nbsp;=&nbsp;&#39;消息记录&#39;;<br>&nbsp;&nbsp;FormPos&nbsp;=&nbsp;&#39;Position&#39;;<br>&nbsp;&nbsp;Notes&nbsp;=&nbsp;&#39;Notes&#39;;<br>&nbsp;&nbsp;Welcome&nbsp;=&nbsp;&#39;欢迎使用消息记录程序，右键弹出菜单&#39;;<br>&nbsp;&nbsp;{程序定义的通知}<br>&nbsp;&nbsp;WM_TRAYICONCLICKED&nbsp;=&nbsp;WM_USER&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;{WM_USER&nbsp;是用户消息范围的起始点，不要发送这个消息到其他程序，除非你像本例一样<br>&nbsp;&nbsp;在此定义它。}<br><br>procedure&nbsp;ShutDown;<br>var<br>&nbsp;&nbsp;WinPlace:&nbsp;TWindowPlacement;<br>begin<br>&nbsp;&nbsp;WinPlace.length&nbsp;:=&nbsp;SizeOf(TWindowPlacement);<br>&nbsp;&nbsp;Shell_NotifyIcon(NIM_DELETE,&nbsp;@IconData);<br>&nbsp;&nbsp;{NIM_DELETE&nbsp;删除托盘图标}<br>&nbsp;&nbsp;GetWindowPlacement(hNoteHandle,&nbsp;@WinPlace);<br>&nbsp;&nbsp;{由于程序可以在最小化期间关闭，你可以获取&nbsp;WinPlace.rcNormalPosition&nbsp;的&nbsp;Rect<br>&nbsp;&nbsp;作为正常位置，如果获取窗体的&nbsp;Rect&nbsp;将在程序最小化时给出错误位置。}<br>&nbsp;&nbsp;WritePrivateProfileString(FormPos,&nbsp;&#39;Top&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;PChar(Int2Str(WinPlace.rcNormalPosition.Top)),IniName);<br>&nbsp;&nbsp;WritePrivateProfileString(FormPos,&nbsp;&#39;Left&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;PChar(Int2Str(WinPlace.rcNormalPosition.Left)),IniName);<br>&nbsp;&nbsp;{如果你创建了字体、画刷或位图这些操作系统对象，你需要删除他们，否则在系统重启<br>&nbsp;&nbsp;前它们会一直保留。}<br>&nbsp;&nbsp;DeleteObject(Brush1);<br>&nbsp;&nbsp;DeleteObject(Font1);<br>&nbsp;&nbsp;DeleteObject(Font2);<br>&nbsp;&nbsp;DeleteObject(Font3);<br>&nbsp;&nbsp;DeleteObject(Font4);<br>&nbsp;&nbsp;{这些&nbsp;DestroyWindow&nbsp;调用也许没有必要，这里是为了确保系统清空它们的引用来避免<br>&nbsp;&nbsp;内存泄漏。}<br>&nbsp;&nbsp;DestroyWindow(hOkBut);<br>&nbsp;&nbsp;DestroyWindow(hAddBut);<br>&nbsp;&nbsp;DestroyWindow(hAddABut);<br>&nbsp;&nbsp;DestroyWindow(hUpdateBut);<br>&nbsp;&nbsp;DestroyWindow(hDeleteBut);<br>&nbsp;&nbsp;DestroyWindow(hDelSelBut);<br>&nbsp;&nbsp;DestroyWindow(hNoChangeBut);<br>&nbsp;&nbsp;DestroyWindow(hHideBut);<br>&nbsp;&nbsp;DestroyWindow(hCloseBut);<br>&nbsp;&nbsp;DestroyWindow(hMinBut);<br>&nbsp;&nbsp;DestroyWindow(hIcon1);<br>&nbsp;&nbsp;DestroyWindow(hLabel1);<br>&nbsp;&nbsp;DestroyWindow(hLabel2);<br>&nbsp;&nbsp;DestroyWindow(hLabel3);<br>&nbsp;&nbsp;DestroyWindow(hEdit1);<br>&nbsp;&nbsp;DestroyWindow(hUpDown1);<br>&nbsp;&nbsp;DestroyWindow(hEdit2);<br>&nbsp;&nbsp;DestroyWindow(hGroup1);<br>&nbsp;&nbsp;DestroyWindow(hListBox1);<br>&nbsp;&nbsp;DestroyWindow(hAdHandle);<br>&nbsp;&nbsp;UnregisterClass(adClass.lpszClassName,&nbsp;hInstance);<br>&nbsp;&nbsp;PostQuitMessage(0);<br>&nbsp;&nbsp;{PostQuitMessage&nbsp;告诉&nbsp;Windows&nbsp;系统消息循环已经结束，这样系统将销毁引用（窗体句<br>&nbsp;&nbsp;柄和注册类）记录。如果你使用&nbsp;ExitProcess(hInstance)&nbsp;退出进程，那么这些句柄和类<br>&nbsp;&nbsp;将在系统重启前一直保留。PostQuitMessage&nbsp;结束消息循环而不是你的进程，你可以在消<br>&nbsp;&nbsp;息循环内做一些清理工作。}<br>end;<br><br>procedure&nbsp;CheckNum;<br>{这个过程检测用户输入到&nbsp;Edit2&nbsp;的数值，限制其在&nbsp;NoteNum&nbsp;范围内}<br>var<br>&nbsp;&nbsp;Str1:&nbsp;string;<br>begin<br>&nbsp;&nbsp;Str1&nbsp;:=&nbsp;GetWindowStr(hEdit2);<br>&nbsp;&nbsp;{GetWindowStr(hWnd)&nbsp;和&nbsp;GetWindowPChar(hWnd)&nbsp;是两个非常有用的函数，你可以使用<br>&nbsp;&nbsp;GetWindowPChar&nbsp;把一个操作系统字符转化为另一个，比如：<br>&nbsp;&nbsp;SetWindowText(hEdit1,GetWindowPChar(hEdit2));}<br>&nbsp;&nbsp;if&nbsp;(Str1&nbsp;=&nbsp;&#39;0&#39;)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hEdit2,&nbsp;&#39;1&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;Str1&nbsp;:=&nbsp;&#39;1&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;Str2Int(Str1)&nbsp;&gt;&nbsp;NoteNum&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hEdit2,&nbsp;PChar(Int2Str(NoteNum)));<br>&nbsp;&nbsp;&nbsp;&nbsp;Str1&nbsp;:=&nbsp;Int2Str(NoteNum);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;Str1&nbsp;&lt;&gt;&nbsp;&#39;&#39;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hDeleteBut,&nbsp;PChar(&#39;删除通知&nbsp;&#39;&nbsp;+&nbsp;Str1));<br>end;<br><br>procedure&nbsp;SizeNote;<br>{这个过程计算主窗体需要的垂直大小，从&nbsp;GetTextExtentPoint32&nbsp;&nbsp;和&nbsp;DrawText<br>使用文字度量。}<br>var<br>&nbsp;&nbsp;i:&nbsp;Integer;<br>&nbsp;&nbsp;TempDC:&nbsp;HDC;<br>begin<br>&nbsp;&nbsp;TempDC&nbsp;:=&nbsp;GetDC(hNoteHandle);<br>&nbsp;&nbsp;SelectObject(TempDC,&nbsp;Font2);<br>&nbsp;&nbsp;GetTextExtentPoint32(TempDC,&nbsp;PostNotes,&nbsp;8,&nbsp;Size1);<br>&nbsp;&nbsp;{GetTextExtentPoint32&nbsp;获取&nbsp;DC&nbsp;上文本的大小}<br>&nbsp;&nbsp;SetRect(Rect1,&nbsp;1,&nbsp;5,&nbsp;appWidth&nbsp;-&nbsp;2,&nbsp;5&nbsp;+&nbsp;Size1.cy);<br>&nbsp;&nbsp;{5+Size1.cy&nbsp;用于上侧的&nbsp;5&nbsp;像素边缘}<br>&nbsp;&nbsp;Position&nbsp;:=&nbsp;5&nbsp;+&nbsp;Size1.cy&nbsp;+&nbsp;2;<br>&nbsp;&nbsp;SetBkMode(TempDC,&nbsp;TRANSPARENT);<br>&nbsp;&nbsp;SelectObject(TempDC,&nbsp;Font1);<br>&nbsp;&nbsp;GetTextExtentPoint32(TempDC,&nbsp;&#39;24.&nbsp;&#39;,&nbsp;4,&nbsp;Size1);<br>&nbsp;&nbsp;{&#39;24.&nbsp;&#39;&nbsp;用于获取数字占用的左边空间}<br>&nbsp;&nbsp;EditAdj&nbsp;:=&nbsp;6&nbsp;+&nbsp;Size1.cx;<br>&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetRect(Rect1,&nbsp;6&nbsp;+&nbsp;Size1.cx,&nbsp;Position,&nbsp;appWidth&nbsp;-&nbsp;6,&nbsp;Position&nbsp;+&nbsp;Size1.cy);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawText(TempDC,&nbsp;PChar(NoteList[i]),&nbsp;Length(NoteList[i]),&nbsp;Rect1,&nbsp;DT_LEFT&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DT_WORDBREAK&nbsp;or&nbsp;DT_CALCRECT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{DrawText()&nbsp;使用&nbsp;DT_CALCRECT&nbsp;标志不绘制任何文本，它调整&nbsp;Rect1&nbsp;的底部，这样<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有文本将填充这个区域。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position&nbsp;:=&nbsp;Rect1.Bottom&nbsp;+&nbsp;2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{使用新的&nbsp;Rect1.Bottom&nbsp;作为下一个&nbsp;Rect1.Top}<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;ReleaseDC(hNoteHandle,&nbsp;TempDC);<br>&nbsp;&nbsp;{SetWindowPos()&nbsp;有很多种标志，它们有助于移动窗体、改变大小、改变窗口的<br>&nbsp;&nbsp;Z&nbsp;顺序或焦点。}<br>&nbsp;&nbsp;SetWindowPos(hNoteHandle,&nbsp;0,<br>&nbsp;&nbsp;&nbsp;&nbsp;Left,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;水平位置<br>&nbsp;&nbsp;&nbsp;&nbsp;Top,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;竖直位置<br>&nbsp;&nbsp;&nbsp;&nbsp;appWidth,&nbsp;&nbsp;//&nbsp;宽度<br>&nbsp;&nbsp;&nbsp;&nbsp;Rect1.Bottom&nbsp;+&nbsp;20,&nbsp;//&nbsp;高度<br>&nbsp;&nbsp;&nbsp;&nbsp;SWP_NOCOPYBITS&nbsp;or&nbsp;SWP_NOMOVE&nbsp;or&nbsp;SWP_SHOWWINDOW&nbsp;or&nbsp;SWP_NOZORDER<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;窗口位置标识<br>&nbsp;&nbsp;&nbsp;&nbsp;);<br>end;<br><br>procedure&nbsp;FillListBox;<br>var<br>&nbsp;&nbsp;i:&nbsp;Integer;<br>&nbsp;&nbsp;NumStr:&nbsp;PChar;<br>begin<br>&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_RESETCONTENT,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;{清空列表框}<br>&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumStr&nbsp;:=&nbsp;PChar(Int2Str(i&nbsp;+&nbsp;1)&nbsp;+&nbsp;&#39;&nbsp;&#39;&nbsp;+&nbsp;NoteList[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_ADDSTRING,&nbsp;0,&nbsp;Integer(NumStr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_SETITEMDATA,&nbsp;i,&nbsp;i&nbsp;+&nbsp;1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{通知列表字符串前面加上一个数字，然后加入列表框。}<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_ADDSTRING,&nbsp;0,&nbsp;Integer(&#39;&nbsp;&#39;));<br>&nbsp;&nbsp;{如果没有通知列表字符串则加入一个空格字符，这样可以显示一个列表选择项。}<br>&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_SETCURSEL,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;{设置列表框的选择项，你可以计算前面的选择项并再次定位它}<br>&nbsp;&nbsp;SetFocus(hListBox1);<br>end;<br><br>procedure&nbsp;AddNote(before:&nbsp;Boolean);<br>{这里添加&nbsp;Edit1&nbsp;的文本到通知列表并刷新列表框，随后更新主窗体}<br>var<br>&nbsp;&nbsp;TempList:&nbsp;array[0..23]&nbsp;of&nbsp;string;<br>&nbsp;&nbsp;Pos,&nbsp;i:&nbsp;Integer;<br>&nbsp;&nbsp;EditStr:&nbsp;string;<br>begin<br>&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;&gt;&nbsp;23&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{通知上限为&nbsp;24&nbsp;条}<br>&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hNoteHandle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;你已经加入超过&nbsp;24&nbsp;条通知了，不能再次加入。&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;太多通知&nbsp;!&#39;,&nbsp;MB_OK&nbsp;or&nbsp;MB_ICONERROR);<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;EditStr&nbsp;:=&nbsp;GetWindowStr(hEdit1);<br>&nbsp;&nbsp;if&nbsp;EditStr&nbsp;=&nbsp;&#39;&#39;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;EditStr&nbsp;:=&nbsp;&#39;&nbsp;&#39;;<br>&nbsp;&nbsp;{如果&nbsp;Edit1&nbsp;内没有文本则添加一个空格，这样&nbsp;INI&nbsp;中不为空。}<br>&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TempList[i]&nbsp;:=&nbsp;NoteList[i];<br>&nbsp;&nbsp;{由于通知可以加入任意位置，先复制一份通知列表}<br>&nbsp;&nbsp;{我们不需要和记录欢迎通知}<br>&nbsp;&nbsp;if&nbsp;(NoteNum&nbsp;=&nbsp;1)&nbsp;and&nbsp;(NoteList[0]&nbsp;=&nbsp;Welcome)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;NoteList[0]&nbsp;:=&nbsp;EditStr<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteList[0]&nbsp;:=&nbsp;EditStr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(NoteNum);<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pos&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_GETCURSEL,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{获取列表框的选项索引}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Pos&nbsp;&lt;&nbsp;0&nbsp;then&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{如果没有选择则退出}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Before&nbsp;then&nbsp;Inc(Pos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{检测通知是否在选择项之前}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteList[Pos]&nbsp;:=&nbsp;EditStr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;Pos&nbsp;+&nbsp;1&nbsp;to&nbsp;NoteNum&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteList[i]&nbsp;:=&nbsp;TempList[i&nbsp;-&nbsp;1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{从&nbsp;TempList&nbsp;复制所有剩下的通知}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(NoteNum);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;EnableWindow(hEdit2,&nbsp;True);<br>&nbsp;&nbsp;EnableWindow(hDeleteBut,&nbsp;True);<br>&nbsp;&nbsp;sendMessage(hUpDown1,&nbsp;UDM_SETRANGE,&nbsp;0,&nbsp;MAKELONG(short(NoteNum),&nbsp;1));<br>&nbsp;&nbsp;{设置上下箭头按钮的范围，MAKELONG&nbsp;把两个&nbsp;16&nbsp;位数值组合为一个&nbsp;32&nbsp;位数值。}<br>&nbsp;&nbsp;SetWindowText(hEdit2,&nbsp;&#39;1&#39;);<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;WritePrivateProfileString(Notes,&nbsp;PChar(Int2Str(i&nbsp;+&nbsp;1)),&nbsp;PChar(NoteList[i]),IniName);<br>&nbsp;&nbsp;{把所有通知列表记录到&nbsp;INI&nbsp;文件中}<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;23&nbsp;do&nbsp;&nbsp;TempList[i]&nbsp;:=&nbsp;&#39;&#39;;<br>&nbsp;&nbsp;{清空&nbsp;TempList&nbsp;释放内存}<br>&nbsp;&nbsp;SizeNote;<br>&nbsp;&nbsp;FillListBox;<br>&nbsp;&nbsp;InvalidateRect(hNoteHandle,&nbsp;nil,&nbsp;True);<br>&nbsp;&nbsp;{InvalidateRect&nbsp;重绘主窗体}<br>end;<br><br>procedure&nbsp;DeleteNote(selNum:&nbsp;Integer);<br>{删除所选通知}<br>var<br>&nbsp;&nbsp;i:&nbsp;Integer;<br><br>&nbsp;&nbsp;procedure&nbsp;NoteNum0;<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;n:&nbsp;Integer;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{没有通知列表字符串时使用}<br>&nbsp;&nbsp;&nbsp;&nbsp;NoteNum&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hEdit2,&nbsp;&#39;1&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hEdit2,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hDeleteBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;n&nbsp;:=&nbsp;1&nbsp;to&nbsp;24&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritePrivateProfileString(Notes,&nbsp;PChar(Int2Str(n)),&nbsp;nil,&nbsp;IniName);<br>&nbsp;&nbsp;&nbsp;&nbsp;{如果&nbsp;&nbsp;WritePrivateProfileString&nbsp;中&nbsp;Text&nbsp;参数为&nbsp;nil，则该行完全被清除。}<br>&nbsp;&nbsp;end;<br><br>begin&nbsp;//DeleteNote<br>&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;&lt;&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;NoteNum0<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;=&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;//&nbsp;NoteNum&nbsp;=&nbsp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteList[0]&nbsp;:=&nbsp;&#39;&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteNum&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;selNum&nbsp;+&nbsp;1&nbsp;=&nbsp;NoteNum&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteList[selNum]&nbsp;:=&nbsp;&#39;&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;selNum&nbsp;to&nbsp;NoteNum&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NoteList[i]&nbsp;:=&nbsp;NoteList[i&nbsp;+&nbsp;1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dec(NoteNum);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;&nbsp;//&nbsp;NoteNum&nbsp;=&nbsp;1<br>&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;&lt;&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;NoteNum0<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hEdit2,&nbsp;&#39;1&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritePrivateProfileString(Notes,&nbsp;PChar(Int2Str(i&nbsp;+&nbsp;1)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PChar(NoteList[i]),&nbsp;IniName);<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;NoteNum&nbsp;+&nbsp;1&nbsp;to&nbsp;24&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritePrivateProfileString(Notes,&nbsp;PChar(Int2Str(i)),&nbsp;nil,&nbsp;IniName);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;NoteNum&nbsp;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;sendMessage(hUpDown1,&nbsp;UDM_SETRANGE,&nbsp;0,&nbsp;MAKELONG(short(NoteNum),&nbsp;1));<br>&nbsp;&nbsp;SizeNote;<br>&nbsp;&nbsp;FillListBox;<br>&nbsp;&nbsp;InvalidateRect(hNoteHandle,&nbsp;nil,&nbsp;True);<br>end;<br><br>procedure&nbsp;ChangeNotes;<br>{这里更新通知列表}<br>var<br>&nbsp;&nbsp;i,&nbsp;Num:&nbsp;Integer;<br>&nbsp;&nbsp;TempList:&nbsp;array[0..23]&nbsp;of&nbsp;string;<br>&nbsp;&nbsp;TempStr:&nbsp;string;<br>begin<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;TempList[i]&nbsp;:=&nbsp;NoteList[i];<br>&nbsp;&nbsp;{复制通知列表}<br>&nbsp;&nbsp;{for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;3&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Num&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_GETITEMDATA,&nbsp;i,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hAdHandle,PChar(&#39;Item&nbsp;Data&nbsp;for&nbsp;1&nbsp;is&nbsp;&nbsp;&#39;+Int2Str(Num)+&#39;&nbsp;&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+Int2Str(SendMessage(hListBox1,&nbsp;LB_GETITEMDATA,&nbsp;i+1,&nbsp;0)))&nbsp;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;No&nbsp;Get&nbsp;Item&nbsp;Data&#39;,MB_YESNO&nbsp;or&nbsp;MB_ICONQUESTION);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Num&nbsp;=&nbsp;LB_ERR&nbsp;then&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;}<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_GETTEXT,&nbsp;i,&nbsp;Integer(@CharBuffer));<br>&nbsp;&nbsp;&nbsp;&nbsp;TempStr&nbsp;:=&nbsp;string(CharBuffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;Delete(TempStr,&nbsp;3,&nbsp;260);<br>&nbsp;&nbsp;&nbsp;&nbsp;Num&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_GETITEMDATA,&nbsp;i,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Num&nbsp;&lt;&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;NoteList[i]&nbsp;:=&nbsp;TempList[Num&nbsp;-&nbsp;1]<br>&nbsp;&nbsp;&nbsp;&nbsp;{除了字符串中的数字外清除其它}<br>&nbsp;&nbsp;&nbsp;&nbsp;{NoteList[i]&nbsp;:=&nbsp;TempList[OldNum-1];}<br>&nbsp;&nbsp;&nbsp;&nbsp;{if&nbsp;Str2Int(TempStr)&nbsp;&gt;&nbsp;9&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;NoteList[i]&nbsp;:=&nbsp;TempList[Str2Int(TempStr)-1]&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;NoteList[i]&nbsp;:=&nbsp;TempList[Str2Int(TempStr[1])-1];}<br>&nbsp;&nbsp;&nbsp;&nbsp;{从&nbsp;tempList&nbsp;中复制通知到列表框的新位置}<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;FillListBox;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;TempList[i]&nbsp;:=&nbsp;&#39;&#39;;<br>&nbsp;&nbsp;SizeNote;<br>&nbsp;&nbsp;InvalidateRect(hNoteHandle,&nbsp;nil,&nbsp;True);<br>&nbsp;&nbsp;TempStr&nbsp;:=&nbsp;&#39;&#39;;<br>&nbsp;&nbsp;EnableWindow(hDelSelBut,&nbsp;True);<br>&nbsp;&nbsp;EnableWindow(hUpdateBut,&nbsp;False);<br>&nbsp;&nbsp;EnableWindow(hNoChangeBut,&nbsp;False);<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;NoteNum&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;WritePrivateProfileString(Notes,&nbsp;PChar(Int2Str(i&nbsp;+&nbsp;1)),&nbsp;PChar(NoteList[i]),IniName);<br>end;<br><br>procedure&nbsp;DragDropListBox;<br>{拖放后改变列表框}<br>var<br>&nbsp;&nbsp;{TempPChar:&nbsp;PChar;}<br>&nbsp;&nbsp;Pos:&nbsp;Byte;<br>&nbsp;&nbsp;PrevNum:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;{UpSelect,&nbsp;DwnSelect&nbsp;从&nbsp;ListBoxProc&nbsp;函数获得}<br>&nbsp;&nbsp;Pos&nbsp;:=&nbsp;UpSelect;<br>&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_GETTEXT,&nbsp;DownSelect,&nbsp;Integer(@CharBuffer));<br>&nbsp;&nbsp;PrevNum&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_GETITEMDATA,&nbsp;DownSelect,&nbsp;0);<br>&nbsp;&nbsp;{记住可以使用：<br>&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_GETTEXTLEN,&nbsp;DwnSelect,&nbsp;0);<br>&nbsp;&nbsp;来获取列表项的&nbsp;PChar&nbsp;字符串长度，也可以使用如下方式分配内存：<br>&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_GETTEXTLEN,&nbsp;DwnSelect,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetMem(TempPChar,&nbsp;length+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_GETTEXT,&nbsp;DwnSelect,&nbsp;Integer(TempPChar));<br>&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_INSERTSTRING,&nbsp;UpSelect,&nbsp;Integer(TempPChar));<br>&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(TempPChar);<br>&nbsp;&nbsp;但是如果你创建了足够大的字符数组，比如这里的&nbsp;CharBuffer&nbsp;，你没有必要调用<br>&nbsp;&nbsp;GetMem(TempPChar,&nbsp;length+1);&nbsp;&nbsp;这里使用了&nbsp;1&nbsp;Kb&nbsp;的长度：<br>&nbsp;&nbsp;&nbsp;&nbsp;Buffer:&nbsp;Array[0..1023]&nbsp;of&nbsp;Char;}<br>&nbsp;&nbsp;if&nbsp;DownSelect&nbsp;&lt;&nbsp;UpSelect&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(UpSelect);<br>&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_INSERTSTRING,&nbsp;UpSelect,&nbsp;Integer(@CharBuffer));<br>&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_SETITEMDATA,&nbsp;UpSelect,&nbsp;PrevNum);<br>&nbsp;&nbsp;if&nbsp;DownSelect&nbsp;&gt;&nbsp;UpSelect&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(DownSelect);<br>&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_DELETESTRING,&nbsp;DownSelect,&nbsp;0);<br>&nbsp;&nbsp;SendMessage(hListBox1,&nbsp;LB_SETCURSEL,&nbsp;Pos,&nbsp;0);<br>&nbsp;&nbsp;EnableWindow(hDelSelBut,&nbsp;False);<br>&nbsp;&nbsp;EnableWindow(hUpdateBut,&nbsp;True);<br>&nbsp;&nbsp;EnableWindow(hNoChangeBut,&nbsp;True);<br>end;<br><br>function&nbsp;Group1Proc(hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam:&nbsp;Integer):&nbsp;Integer;&nbsp;stdcall;<br>begin<br>&nbsp;&nbsp;{这里处理&nbsp;Group1&nbsp;的消息}<br>&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;{因为&nbsp;hDeleteBut&nbsp;是&nbsp;Group1&nbsp;的子窗体，所以它的按钮点击消息被发到此处理。}<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_COMMAND:&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hDeleteBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetWindowStr(hEdit2)&nbsp;=&nbsp;&#39;&#39;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hEdit2,&nbsp;&#39;1&#39;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteNote(SendMessage(hUpDown1,&nbsp;UDM_GETPOS,&nbsp;0,&nbsp;0)&nbsp;-&nbsp;1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(lParam&nbsp;=&nbsp;abs(hEdit2))&nbsp;and&nbsp;(HIWORD(wParam)&nbsp;=&nbsp;EN_UPDATE)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckNum;<br>&nbsp;&nbsp;&nbsp;&nbsp;{你想检测用户在&nbsp;Edit2&nbsp;中输入的内容可以通过&nbsp;lParam&nbsp;=&nbsp;abs(hEdit2)&nbsp;和一个通知<br>&nbsp;&nbsp;&nbsp;&nbsp;消息&nbsp;EN_UPDATE&nbsp;来完成，它是&nbsp;32&nbsp;位&nbsp;wParam&nbsp;的高位&nbsp;16位。EN_UPDATE&nbsp;消息在文本<br>&nbsp;&nbsp;&nbsp;&nbsp;显示之前被发送。}<br>&nbsp;&nbsp;end;&nbsp;//&nbsp;case<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(PGroup1Proc,&nbsp;hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;{如果你通过&nbsp;SetWindowLong(hGroup1,&nbsp;GWL_WNDPROC,&nbsp;Longint(@Group1Proc));<br>&nbsp;&nbsp;转换了系统&nbsp;&nbsp;WndProc&nbsp;，你需要使用&nbsp;CallWindowProc()&nbsp;而不是&nbsp;DefWindowProc()<br>&nbsp;&nbsp;来获取默认的处理过程。}<br>end;<br><br>function&nbsp;ListboxProc(hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam:&nbsp;Integer):&nbsp;Integer;&nbsp;stdcall;<br>{这里需要获取鼠标拖放的点击消息}<br>var<br>&nbsp;&nbsp;X,&nbsp;Y,&nbsp;selNum:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_LBUTTONUP:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;:=&nbsp;LOWORD(lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y&nbsp;:=&nbsp;HIWORD(lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{鼠标位置在&nbsp;lParam&nbsp;的高位与低位给出}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selNum&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_ITEMFROMPOINT,&nbsp;0,&nbsp;MAKELPARAM(X,&nbsp;Y));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;X&nbsp;&lt;&nbsp;145&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{X&nbsp;&lt;&nbsp;147&nbsp;确保鼠标按键抬起在列表框内部，你也需要检测&nbsp;Y。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;DoChange&nbsp;and&nbsp;(DownSelect&nbsp;&lt;&gt;&nbsp;selNum)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpSelect&nbsp;:=&nbsp;selNum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DragDropListBox;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ChangeListBox&nbsp;重新排列通知列表但是不改变他们的数字编号。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_LBUTTONDOWN:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;:=&nbsp;LOWORD(lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y&nbsp;:=&nbsp;HIWORD(lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selNum&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_ITEMFROMPOINT,&nbsp;0,&nbsp;MAKELPARAM(X,&nbsp;Y));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{LB_ITEMFROMPOINT&nbsp;获得距离鼠标指针最近的列表项索引}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;HIWORD(selNum)&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DownSelect&nbsp;:=&nbsp;LOWORD(selNum);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DoChange&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(PListBox1Proc,&nbsp;hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam);<br>end;<br><br>procedure&nbsp;HideGroup;<br>begin<br>&nbsp;&nbsp;{由于&nbsp;Group1&nbsp;内的控件是分组的子控件，所以它们也隐藏。}<br>&nbsp;&nbsp;if&nbsp;IsWindowVisible(hGroup1)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hGroup1,&nbsp;SW_HIDE);<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hPanel1,&nbsp;SW_SHOW);<br>&nbsp;&nbsp;&nbsp;&nbsp;{ShowWindow(hRBYellow,SW_SHOW);}<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hHideBut,&nbsp;&#39;显示分组&#39;);<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hGroup1,&nbsp;SW_SHOW);<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hPanel1,&nbsp;SW_HIDE);<br>&nbsp;&nbsp;&nbsp;&nbsp;{ShowWindow(hRBYellow,SW_HIDE);}<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hHideBut,&nbsp;&#39;隐藏分组&#39;);<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;RBStandClick(Stand:&nbsp;Boolean);<br>begin<br>&nbsp;&nbsp;SendMessage(hRBYellow,&nbsp;BM_SETCHECK,&nbsp;Integer(not&nbsp;Stand),&nbsp;0);<br>&nbsp;&nbsp;SendMessage(hRBstand,&nbsp;BM_SETCHECK,&nbsp;Integer(Stand),&nbsp;0);<br>&nbsp;&nbsp;if&nbsp;Stand&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SetClassLong(hAdHandle,&nbsp;GCL_HBRBACKGROUND,&nbsp;COLOR_BTNFACE&nbsp;+&nbsp;1);<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SetClassLong(hAdHandle,&nbsp;GCL_HBRBACKGROUND,&nbsp;Brush1);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;invalidateRect(hAdHandle,&nbsp;nil,&nbsp;True);<br>end;<br><br>function&nbsp;Panel1Proc(hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam:&nbsp;Integer):&nbsp;Integer;&nbsp;stdcall;<br>begin<br>&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;{WM_PAINT:&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetRect(Rect1,2,2,220,56);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeginPaint(hWnd,&nbsp;PS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DrawEdge(PS.hDC,Rect1,EDGE_RAISED,BF_RECT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndPaint(hWnd,PS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;}<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_COMMAND:&nbsp;if&nbsp;LParam&nbsp;=&nbsp;abs(hRBStand)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RBStandClick(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;LParam&nbsp;=&nbsp;abs(hRBYellow)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RBStandClick(False)<br>&nbsp;&nbsp;end;&nbsp;//&nbsp;case<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(PPanel1Proc,&nbsp;hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam);<br>end;<br><br>function&nbsp;AddDelProc(hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam:&nbsp;LongInt):&nbsp;LongInt;&nbsp;stdcall;<br>{添加删除相关的消息在这里处理}<br>var<br>&nbsp;&nbsp;Num:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_DESTROY:&nbsp;SetFocus(hNoteHandle);<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_COMMAND:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;LParam&nbsp;=&nbsp;abs(hOkBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMessage(hAdHandle,&nbsp;WM_CLOSE,&nbsp;0,&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{为了关闭并销毁一个新类如&nbsp;hAdHandle&nbsp;的窗口，使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMessage(hAdHandle,WM_CLOSE,0,0)&nbsp;可以进行默认的关闭和销毁，并<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;销毁它的所有子窗体。不要调用&nbsp;PostQuitMessage&nbsp;，因为这将终止一切。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hAddBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddNote(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hAddABut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddNote(False)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hHideBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HideGroup<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hDelSelBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Num&nbsp;:=&nbsp;SendMessage(hListBox1,&nbsp;LB_GETCURSEL,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Num&nbsp;&lt;&gt;&nbsp;LB_ERR&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteNote(Num);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{测试选择项是否在列表框内}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hUpdateBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChangeNotes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hNoChangeBut)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FillListBox;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hDelSelBut,&nbsp;True);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hUpdateBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(hNoChangeBut,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(lParam&nbsp;=&nbsp;abs(hEdit1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;(HIWORD(wParam)&nbsp;=&nbsp;EN_MAXTEXT)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hAdHandle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PChar(&#39;你想在此编辑框内输入超过它所能容纳的文本数量！&nbsp;&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;#13&nbsp;+&nbsp;SysErrorMessage(GetLastError)),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;太多文本&#39;,&nbsp;MB_OK&nbsp;or&nbsp;MB_ICONERROR);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{EN_MAXTEXT&nbsp;通知消息在编辑框超越其容量时发出。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_CTLCOLOREDIT:&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hEdit1)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{这是编辑框预绘制消息，用于设置编辑框的喷绘颜色}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTextColor(wParam,&nbsp;$00000000);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetBkColor(wParam,&nbsp;$0080FFFF);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;wClass.hbrBackground&nbsp;{Brush1};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{result&nbsp;是用于喷绘非文本覆盖区域的画刷}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;&nbsp;//case<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;DefWindowProc(hWnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;{由于这是一个新类，所以这里使用&nbsp;DefWindowProc()。}<br>end;<br><br>procedure&nbsp;ShowAddDelete;<br>begin<br>&nbsp;&nbsp;{这里创建添加和删除对话框，它可以随着屏幕分辨率改变尺寸。}<br>&nbsp;&nbsp;if&nbsp;hAdHandle&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;{重要：当&nbsp;hAdHandle&nbsp;关闭时它默认销毁了，但是&nbsp;adClass&nbsp;并没有被释放，所以<br>&nbsp;&nbsp;&nbsp;&nbsp;你没有必要再次注册。}<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{这里创建第二个类，因为需要使用不同的背景颜色和不同的&nbsp;lpfnWndProc&nbsp;。}<br>&nbsp;&nbsp;&nbsp;&nbsp;adClass.hInstance&nbsp;:=&nbsp;hInstance;<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;adClass&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Style&nbsp;:=&nbsp;CS_PARENTDC&nbsp;or&nbsp;CS_BYTEALIGNCLIENT;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hIcon&nbsp;:=&nbsp;LoadIcon(hInstance,&nbsp;&#39;MAINICON&#39;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpfnWndProc&nbsp;:=&nbsp;@AddDelProc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{这里子类化使用一个不同的消息处理过程&nbsp;AddDelProc&nbsp;，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和下面的&nbsp;MessageProc&nbsp;对比一下。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hbrBackground&nbsp;:=&nbsp;COLOR_BTNFACE&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpszClassName&nbsp;:=&nbsp;&#39;Add&nbsp;Delete&#39;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hCursor&nbsp;:=&nbsp;wClass.hCursor;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;RegisterClass(adClass);<br>&nbsp;&nbsp;end;&nbsp;//&nbsp;hAdHandle&nbsp;=&nbsp;0<br>&nbsp;&nbsp;GetWindowRect(hNoteHandle,&nbsp;Rect1);<br>&nbsp;&nbsp;{希望&nbsp;Rect1&nbsp;内的主窗体位置来定位&nbsp;hAdHandle&nbsp;窗口。}<br>&nbsp;&nbsp;{通过&nbsp;WS_EX_TOOLWINDOW&nbsp;风格，可以给它赋值一个父窗体(hNoteHandle)&nbsp;。}<br>&nbsp;&nbsp;hAdHandle&nbsp;:=&nbsp;CreateWindowEx(WS_EX_TOOLWINDOW,&nbsp;adClass.lpszClassName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&#39;&nbsp;添加和删除通知&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_CAPTION&nbsp;or&nbsp;WS_SYSMENU&nbsp;{&nbsp;or&nbsp;WS_MINIMIZEBOX},<br>&nbsp;&nbsp;&nbsp;&nbsp;{WS_SYSMENU&nbsp;放置一个&nbsp;X&nbsp;关闭按钮}<br>&nbsp;&nbsp;&nbsp;&nbsp;Rect1.Left&nbsp;+&nbsp;120,<br>&nbsp;&nbsp;&nbsp;&nbsp;Rect1.Top&nbsp;+&nbsp;20,<br>&nbsp;&nbsp;&nbsp;&nbsp;420,<br>&nbsp;&nbsp;&nbsp;&nbsp;428,<br>&nbsp;&nbsp;&nbsp;&nbsp;hNoteHandle,<br>&nbsp;&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;&nbsp;hInstance,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;nil);<br><br>&nbsp;&nbsp;hPanel1&nbsp;:=&nbsp;CreateWindowEX(WS_EX_TOPMOST<br>&nbsp;&nbsp;&nbsp;&nbsp;{WS_EX_CONTROLPARENT&nbsp;or&nbsp;WS_EX_WINDOWEDGE&nbsp;or&nbsp;WS_EX_CLIENTEDGE,},<br>&nbsp;&nbsp;&nbsp;&nbsp;adClass.lpszClassName,&nbsp;&#39;&#39;,&nbsp;{WS_VISIBLE&nbsp;or&nbsp;}&nbsp;WS_CHILD&nbsp;or&nbsp;WS_DLGFRAME<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;or&nbsp;WS_CLIPSIBLINGS&nbsp;{WS_BORDER{SS_CENTER},<br>&nbsp;&nbsp;&nbsp;&nbsp;13,&nbsp;12,&nbsp;320,&nbsp;60,&nbsp;hAdHandle,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;hLabel1&nbsp;:=&nbsp;CreateWindow(&#39;Static&#39;,&nbsp;&#39;改变通知项&#39;,&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;SS_CENTER&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_CLIPSIBLINGS,<br>&nbsp;&nbsp;&nbsp;&nbsp;6,&nbsp;6,&nbsp;374,&nbsp;26,&nbsp;hAdHandle,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;{这里的&nbsp;Group1、&nbsp;Edit2、&nbsp;UpDown1、&nbsp;Icon1&nbsp;和&nbsp;DeleteBut&nbsp;为了演示如何使用&nbsp;Group1<br>&nbsp;&nbsp;作为其他控件的父窗体，这里子类化以处理它的消息。}<br>&nbsp;&nbsp;hGroup1&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;用于&nbsp;API&nbsp;信息&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_GROUPBOX&nbsp;or&nbsp;BS_TEXT&nbsp;or&nbsp;WS_CLIPSIBLINGS,<br>&nbsp;&nbsp;&nbsp;&nbsp;13,&nbsp;32,&nbsp;280,&nbsp;60,&nbsp;hAdHandle,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br>&nbsp;&nbsp;{如果你移动&nbsp;Group1&nbsp;则它的子控件一起移动，如果隐藏&nbsp;Group1&nbsp;则所有子控件隐藏。}<br><br>&nbsp;&nbsp;hEdit2&nbsp;:=&nbsp;CreateWindowEx(WS_EX_CLIENTEDGE,&nbsp;&#39;Edit&#39;,&nbsp;&#39;1&#39;,&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD<br>&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;ES_LEFT&nbsp;or&nbsp;ES_NUMBER&nbsp;or&nbsp;WS_CLIPSIBLINGS,<br>&nbsp;&nbsp;&nbsp;&nbsp;8,&nbsp;22,&nbsp;52,&nbsp;25,&nbsp;hGroup1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br>&nbsp;&nbsp;{位置&nbsp;25,22,52,25&nbsp;是相对于&nbsp;Group1&nbsp;而不是&nbsp;hAdHandle&nbsp;窗口。}<br><br>&nbsp;&nbsp;hUpDown1&nbsp;:=&nbsp;CreateUpDownControl(WS_CHILD&nbsp;or&nbsp;WS_VISIBLE&nbsp;or&nbsp;UDS_SETBUDDYINT&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;UDS_ALIGNRIGHT&nbsp;or&nbsp;UDS_ARROWKEYS&nbsp;{or&nbsp;UDS_AUTOBUDDY},&nbsp;25,&nbsp;12,&nbsp;19,&nbsp;25,&nbsp;hGroup1,<br>&nbsp;&nbsp;&nbsp;&nbsp;123,&nbsp;hInstance,&nbsp;hEdit2,&nbsp;NoteNum,&nbsp;1,&nbsp;1);<br>&nbsp;&nbsp;{UpDown1&nbsp;控件有一个伴随控件(UDS_SETBUDDYINT)，它与&nbsp;(hEdit2)&nbsp;上下简体控件紧密<br>&nbsp;&nbsp;关联，使用与正常按钮不一样的消息，参见&nbsp;Win32&nbsp;API&nbsp;中的&nbsp;&quot;Up-Down&nbsp;Controls&quot;&nbsp;。}<br><br>&nbsp;&nbsp;hDeleteBut&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;删除通知&nbsp;1&#39;,&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;BS_PUSHBUTTON&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;BS_TEXT&nbsp;or&nbsp;WS_CLIPSIBLINGS,<br>&nbsp;&nbsp;&nbsp;&nbsp;70,&nbsp;22,&nbsp;110,&nbsp;24,&nbsp;hGroup1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;hRBstand&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;标准颜色窗体&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_RADIOBUTTON,<br>&nbsp;&nbsp;&nbsp;&nbsp;8,&nbsp;5,&nbsp;180,&nbsp;24,&nbsp;hPanel1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;hRBYellow&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;黄颜色窗体&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_RADIOBUTTON,<br>&nbsp;&nbsp;&nbsp;&nbsp;8,&nbsp;30,&nbsp;180,&nbsp;24,&nbsp;hPanel1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;hIcon1&nbsp;:=&nbsp;CreateWindow(&#39;Static&#39;,&nbsp;&#39;MAINICON&#39;,&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;SS_ICON,&nbsp;188,&nbsp;8&nbsp;{22},&nbsp;1,&nbsp;1,&nbsp;hPanel1,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;hHideBut&nbsp;:=&nbsp;CreateWindow(&#39;Button&#39;,&nbsp;&#39;隐藏分组&#39;,&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or<br>&nbsp;&nbsp;&nbsp;&nbsp;BS_PUSHBUTTON&nbsp;or&nbsp;BS_TEXT&nbsp;or&nbsp;WS_CLIPSIBLINGS,<br>&nbsp;&nbsp;&nbsp;&nbsp;310,&nbsp;40,&nbsp;90,&nbsp;24,&nbsp;hAdHandle,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;{这里希望设置编辑框的背景颜色，参见&nbsp;adProc&nbsp;的&nbsp;WM_CTLCOLOREDIT&nbsp;。}<br>&nbsp;&nbsp;hEdit1&nbsp;:=&nbsp;CreateWindowEx(WS_EX_CLIENTEDGE,&nbsp;&#39;Edit&#39;,&nbsp;&#39;在此输入通知&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;ES_LEFT&nbsp;or&nbsp;ES_MULTILINE&nbsp;{or&nbsp;ES_WANTRETURN},<br>&nbsp;&nbsp;&nbsp;&nbsp;5,&nbsp;100,&nbsp;AppWidth&nbsp;-&nbsp;EditAdj,&nbsp;(EditHgt&nbsp;*&nbsp;3)&nbsp;+&nbsp;7,&nbsp;hAdHandle,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br>&nbsp;&nbsp;{Edit1&nbsp;的高度和宽度改变来匹配显示消息的字体高度和宽度，这样用户在这个编辑框看到<br>&nbsp;&nbsp;的将和最终通知记录部分显示的结果匹配。如果没有&nbsp;ES_AUTOVSCROLL&nbsp;风格，在三行之外<br>&nbsp;&nbsp;将不能输入文字，这就限制文本长度小于&nbsp;150&nbsp;，现在&nbsp;CharBuffer&nbsp;的长度为&nbsp;256，这样<br>&nbsp;&nbsp;就有足够的控件可用。}<br><br>&nbsp;&nbsp;{留下空间适应编辑框的字体变化}<br>&nbsp;&nbsp;hLabel2&nbsp;:=&nbsp;CreateWindow(&#39;Static&#39;,&nbsp;&#39;&lt;--&nbsp;