Windows屏幕保护程序

上传人:ni****g 文档编号:570948187 上传时间:2024-08-07 格式:PPT 页数:41 大小:163.50KB
返回 下载 相关 举报
Windows屏幕保护程序_第1页
第1页 / 共41页
Windows屏幕保护程序_第2页
第2页 / 共41页
Windows屏幕保护程序_第3页
第3页 / 共41页
Windows屏幕保护程序_第4页
第4页 / 共41页
Windows屏幕保护程序_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《Windows屏幕保护程序》由会员分享,可在线阅读,更多相关《Windows屏幕保护程序(41页珍藏版)》请在金锄头文库上搜索。

1、北华航天工业学院计算机系 制作VC+VC+程序设计项目实践程序设计项目实践贾振华贾振华Windows屏幕保护程序北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式第第2 2章章 WindowsWindows屏幕保护程序屏幕保护程序学学习目目标:1. 1. 屏幕保屏幕保护基本原理基本原理2. 2. 如何提高如何提高绘图效率效率3. VC+3. VC+中中对鼠鼠标的控制的控制4. 4. 加加载图片的方法片的方法北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.12.1屏幕保护的基本知识屏幕保护的基本知识1 1屏幕保屏幕保护程序原理程序原理

2、屏幕保屏幕保护程序就是普通的可程序就是普通的可执行程序(行程序(.exe.exe)。)。只不只不过WindowsWindows把它把它换了一个了一个扩展名(展名(.scr.scr),放),放在了系在了系统目目录下,由操作系下,由操作系统调用而已。用而已。对Windows NTWindows NT和和Windows 2000Windows 2000这个目个目录是是C:WINNTsystem32C:WINNTsystem32,对于于Win95Win95,Win98Win98这个目个目录是是C:WindowsC:Windows和和C:WindowssystemC:Windowssystem。北华航天

3、工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.12.1屏幕保护的基本知识屏幕保护的基本知识2屏幕保屏幕保护程序激活的条件程序激活的条件(1 1)在)在规定定时间内没有鼠内没有鼠标或或键盘输入入(2 2)当前的活)当前的活动窗口是窗口是标准的准的WINDOWSWINDOWS应用用(3 3)如果当前活)如果当前活动的程序接管了字参数的程序接管了字参数 wParam wParam 值为SC_SCREENSAVE SC_SCREENSAVE 的的WM_SYSCOMMAND WM_SYSCOMMAND 消息并且不消息并且不传递到到 DefWindowProcDefWindow

4、Proc()函数就可以禁止屏幕保()函数就可以禁止屏幕保护程序。程序。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.12.1屏幕保护的基本知识屏幕保护的基本知识3 3屏幕保屏幕保护程序的作用程序的作用用用户可以通可以通过控制面板控制面板选择、设置和置和预览需要的需要的屏幕保屏幕保护程序,并可以配置屏幕保程序,并可以配置屏幕保护程序的参数。程序的参数。当鼠当鼠标和和键盘空空闲一段一段时间后,屏幕保后,屏幕保护程序即程序即运行。屏幕保运行。屏幕保护程序主要有两个作用:程序主要有两个作用: (1)(1)避免避免长时间显示同一画面,示同一画面,损坏坏显示器。示器。

5、(2)(2)避免屏幕上机密信息的泄露。避免屏幕上机密信息的泄露。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.12.2.1显示的图形为什么会闪烁显示的图形为什么会闪烁绘图过程大多放在程大多放在OnDrawOnDraw()函数或者()函数或者OnPaintOnPaint()()函数中,函数中,OnDrawOnDraw()函数在()函数在进行屏幕行屏幕显示示时是由是由OnPaintOnPaint()函数()函数进行行调用的。当窗口由于任何原因需要用的。当窗口由于任何原因需要重重绘时,总是先用背景色将是先用背景色将显

6、示区清除,然后才示区清除,然后才调用用OnPaintOnPaint函数,而背景色往往与函数,而背景色往往与绘图内容反差内容反差很大,很大,这样在短在短时间内背景色与内背景色与显示示图形的交替形的交替出出现,使得,使得显示窗口看起来在示窗口看起来在闪。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.12.2.1显示的图形为什么会闪烁显示的图形为什么会闪烁简单图形之所以看起来没有复形之所以看起来没有复杂图形那么形那么闪是因是因为复复杂图形占的面形占的面积大,重画大,重画时造成的反差比造成的反差比较大,所以感大,所以感

7、觉上要上要闪得得厉害一些,但是害一些,但是闪烁频率率要低。要低。那那为什么什么动画的重画画的重画频率高,而看起来却不率高,而看起来却不闪?因因为闪烁就是反差,反差越大,就是反差,反差越大,闪烁越越厉害。而害。而动画的画的连续两个两个帧之之间的差异很小所以看起来不的差异很小所以看起来不闪。因此。因此动画的重画画的重画频率率虽然很高,但看起来却然很高,但看起来却不不闪。但如果在。但如果在动画的每一画的每一帧中中间加一加一张纯白的白的帧,结果就不一果就不一样了。了。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.22.

8、2.2如何避免闪烁如何避免闪烁窗口形成窗口形成时给窗口的注册窗口的注册类的背景刷的背景刷赋值为NULLNULL也可以在形成以后修改背景也可以在形成以后修改背景可以重可以重载OnEraseBkgnd(CDC* pDC)OnEraseBkgnd(CDC* pDC)函数,直接函数,直接返回返回TRUETRUE这样背景没有了,背景没有了,结果果图形形显示的确不示的确不闪了,但了,但是是显示也象前面所示也象前面所说的一的一样,变得一得一团乱。乱。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.22.2.2如何避免闪烁如何避

9、免闪烁为了更好的解决屏幕了更好的解决屏幕闪烁的的问题,就要用到双,就要用到双缓存的方法。双存的方法。双缓冲就是除了在屏幕上有冲就是除了在屏幕上有图形形进行行显示以外,在内存中也有示以外,在内存中也有图形在形在绘制。可以把要制。可以把要显示的示的图形先在内存中形先在内存中绘制好,然后再一次性的制好,然后再一次性的将内存中的将内存中的图形按照一个点一个点地覆盖到屏幕形按照一个点一个点地覆盖到屏幕上去(上去(这个个过程非常快,因程非常快,因为是非常是非常规整的内存整的内存拷拷贝)。)。这样在内存中在内存中绘图时,随便用什么反差,随便用什么反差大的背景色大的背景色进行清除都不会行清除都不会闪,因,因为

10、看不看不见。当。当复制到屏幕上复制到屏幕上时,因,因为内存中最内存中最终的的图形与屏幕形与屏幕显示示图形差形差别很小,很小,这样看起来屏幕就不会看起来屏幕就不会闪。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现首先首先给出出实现的程序,在的程序,在OnDraw(CDC *pDC)OnDraw(CDC *pDC)函数函数中添加如下代中添加如下代码:CDC MemDC; /CDC MemDC; /首先定首先定义一个一个显示示设备对象象CBitmap MemBitmap; /CBi

11、tmap MemBitmap; /定定义一个位一个位图对象象/建立与屏幕建立与屏幕显示兼容的内存示兼容的内存显示示设备MemDC.CreateCompatibleDC(NULL);MemDC.CreateCompatibleDC(NULL);北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现 /下面建立一个与屏幕下面建立一个与屏幕显示兼容的位示兼容的位图,位,位图的大的大小可以用窗口的大小小可以用窗口的大小MemBitmap.CreateCompatibleBitmap(pDC,

12、nWidth,nMemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);Height);/将位将位图选入到内存入到内存显示示设备中中/只有只有选入了位入了位图的内存的内存显示示设备才有地方才有地方绘图,画到指定的位画到指定的位图上上CBitmap CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);*pOldBit=MemDC.SelectObject(&MemBitmap);北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.

13、2.32.2.3双缓冲的实现双缓冲的实现/先用背景色将位先用背景色将位图清除干清除干净,以白色,以白色为例例MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(25MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255);5,255,255);/绘图MemDC.MoveTo();MemDC.MoveTo();MemDC.LineTo();MemDC.LineTo();北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3

14、双缓冲的实现双缓冲的实现/将内存中的将内存中的图拷拷贝到屏幕上到屏幕上进行行显示示pDC-pDC-BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOBitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);PY);/绘图完成后的清理完成后的清理MemBitmap.DeleteObject();MemBitmap.DeleteObject();MemDC.DeleteDC();MemDC.DeleteDC();北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效

15、率2.2.32.2.3双缓冲的实现双缓冲的实现其中,函数其中,函数BitBltBitBlt是是对指定的源指定的源设备环境区域中境区域中的像素的像素进行位行位块(bit_blockbit_block)转换,以,以传送到目送到目标设备环境。境。函数原型:函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,nYDest,int nWidth,int nHeight,HDC hdcSrc, int nXSrc

16、,int nYSrc,DWORD dwRop) int nXSrc,int nYSrc,DWORD dwRop);其中,各参数含其中,各参数含义如下所示:如下所示:北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现hdcDesthdcDest:指向目:指向目标设备环境的句柄。境的句柄。nXDestnXDest:指定目:指定目标矩形区域左上角的矩形区域左上角的X X轴逻辑坐坐标。nYDestnYDest:指定目:指定目标矩形区域左上角的矩形区域左上角的Y Y轴逻辑坐坐标。nWidt

17、hnWidth:指定源和目:指定源和目标矩形区域的矩形区域的逻辑宽度。度。nHeightnHeight:指定源和目:指定源和目标矩形区域的矩形区域的逻辑高度。高度。hdcSrchdcSrc:指向源:指向源设备环境的句柄。境的句柄。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现nXSrcnXSrc:指定源矩形区域左上角的:指定源矩形区域左上角的X X轴逻辑坐坐标。nYSrcnYSrc:指定源矩形区域左上角的:指定源矩形区域左上角的Y Y轴逻辑坐坐标。dwRopdwRop:指定光

18、:指定光栅操作代操作代码。这些代些代码将定将定义源矩源矩形区域的形区域的颜色数据,如何与目色数据,如何与目标矩形区域的矩形区域的颜色色数据数据组合以完成最后的合以完成最后的颜色。色。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.42.2.4提高绘图效率提高绘图效率实际上,在上,在OnDraw(CDC *pDC)OnDraw(CDC *pDC)中中绘制的制的图并不是所有都并不是所有都显示了的,例如:在示了的,例如:在OnDrawOnDraw()()函数中画了两个矩形,在一次重函数中画了两个矩形,在一次重绘中中虽然

19、然两个矩形的两个矩形的绘制函数都有制函数都有执行,但是很有行,但是很有可能只有一个可能只有一个显示了,示了,这是因是因为MFCMFC本身本身为了提高重了提高重绘的效率的效率设置了裁剪区。裁剪区置了裁剪区。裁剪区的作用就是:只有在的作用就是:只有在这个区内的个区内的绘图过程程才会真正有效,在区外的是无效的,即使才会真正有效,在区外的是无效的,即使在区外在区外执行了行了绘图函数也是不会函数也是不会显示的。示的。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.42.2.4提高绘图效率提高绘图效率因因为多数情况下窗口重多

20、数情况下窗口重绘的的产生大多是因生大多是因为窗口窗口部分被遮部分被遮挡或者窗口有或者窗口有滚动发生,改生,改变的区域并的区域并不是整个不是整个图形而只有一小部分,形而只有一小部分,这一部分需要改一部分需要改变的就是的就是pDCpDC中的裁剪区了。因中的裁剪区了。因为显示(往内存或示(往内存或者者显存都叫存都叫显示)比示)比绘图过程的程的计算要算要费时得多,得多,有了裁剪区后有了裁剪区后显示的就只是示的就只是应该显示的部分,大示的部分,大大提高了大提高了显示效率。但是示效率。但是这个裁剪区是个裁剪区是MFCMFC设置的,置的,它已它已经为我我们提高了提高了显示效率,在示效率,在进行复行复杂图形形

21、的的绘制制时如何如何进一步提高效率呢?那就只有去掉一步提高效率呢?那就只有去掉在裁剪区外的在裁剪区外的绘图过程了。可以先用程了。可以先用pDC-GetClipBoxpDC-GetClipBox()得到裁剪区,然后在()得到裁剪区,然后在绘图时判断你的判断你的图形是形是否在否在这个区内,如果在就画,不在就不画。个区内,如果在就画,不在就不画。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.12.3.1鼠标消息处理流程鼠标消息处理流程当用当用户在画板上按下鼠在画板上按下鼠标时,WINDOWSWINDOWS将鼠

22、将鼠标消息消息放在主框架窗口消息放在主框架窗口消息队列中列中MFCMFC接收到此消息后,接收到此消息后,先将其先将其转化,然后最先化,然后最先传送鼠送鼠标消息消息给视图对象,象,若若视图类没有在没有在视图类消息映射表中消息映射表中对此消息此消息进行映射(即行映射(即视图没有提供没有提供处理器),理器),则MFCMFC重重发消消息息给文档文档对象。若文档象。若文档类消息映射表中没有消息映射表中没有对此此消息消息进行映射,行映射,则MFCMFC重重发该消息消息给主窗口主窗口类处理,理,若主窗口也没有,若主窗口也没有,则发给应用程序。若用程序。若还没有映没有映射射处理,理,则按缺省按缺省处理。理。因

23、此,因此,应在在视图中添中添加鼠加鼠标消息消息处理函数。理函数。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理1. 鼠标消息 WindowsWindows定定义的鼠的鼠标消息共有消息共有2020条,其中非条,其中非编辑区的鼠区的鼠标消息一般交由系消息一般交由系统处理,程序只理,程序只处理理编辑区内的鼠区内的鼠标消息。消息。编辑区内的鼠区内的鼠标消息共有消息共有1010条:条:WM_MOUSEMOVE WM_MOUSEMOVE 移移动鼠鼠标WM_LBUTTONDOWN

24、WM_LBUTTONDOWN 按下鼠按下鼠标左左键WM_LBUTTONUP WM_LBUTTONUP 释放鼠放鼠标左左键WM_LBUTTONDBLCLK WM_LBUTTONDBLCLK 双双击鼠鼠标左左键WM_RBUTTONDBLCLK WM_RBUTTONDBLCLK 按下鼠按下鼠标右右键WM_RBUTTONUP WM_RBUTTONUP 释放鼠放鼠标右右键WM_RBUTTONDBLCLK WM_RBUTTONDBLCLK 双双击鼠鼠标右右键WM_MBUTTONDOWM WM_MBUTTONDOWM 按下鼠按下鼠标中中键WM_MBUTTONUP WM_MBUTTONUP 释放鼠放鼠标中中键

25、WM_MBUTTONDBLCLK WM_MBUTTONDBLCLK 双双击鼠鼠标中中键北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理对于上面所列的鼠于上面所列的鼠标操作中的最后两种,不能直操作中的最后两种,不能直接使用接使用WindowsWindows定定义的消息来判断,只能通的消息来判断,只能通过编程,程,将多种消息和数据将多种消息和数据组合之后判断。例如,判断用合之后判断。例如,判断用户是否按下鼠是否按下鼠标左左键之后之后进行拖行拖动操作可以通操作可以通过以下程序

26、段来以下程序段来实现,用,用casecase语句来句来实现:case WM_MOUSEMOVEcase WM_MOUSEMOVE:if (wParam&MK_LBUTTON) /if (wParam&MK_LBUTTON) /只只处理鼠理鼠标拖拖动的消息的消息 / / 处理程序理程序 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理在在处理鼠理鼠标消息的消息的过程中,消息的程中,消息的wParamwParam参数和参数和lParamlParam参参数起了重要的作用。数起

27、了重要的作用。wParamwParam参数中保存了在消息参数中保存了在消息产生生时其其他操作他操作进行的状行的状态;用;用户可以通可以通过位屏蔽操作来判断在位屏蔽操作来判断在该消息消息产生的同生的同时,其余操作是否正在,其余操作是否正在进行。行。这正是在程序正是在程序中判断复中判断复杂鼠鼠标操作的基本方法。例如,上面判断拖操作的基本方法。例如,上面判断拖动操操作的程序段就用了位操作作的程序段就用了位操作 wParamwParam MK_LBUTTON, MK_LBUTTON, 判断在判断在鼠鼠标移移动(WM_MOUSEMOVEWM_MOUSEMOVE)的同)的同时鼠鼠标左左键是否同是否同时被接

28、被接下。如果,鼠下。如果,鼠标左左键同同时按下,按下,则位操作的位操作的结果果为TRUETRUE,说明当前操作明当前操作为拖拖动操作,程序可以操作,程序可以继续进行下一步行下一步处理。理。又如需要判断又如需要判断单击鼠鼠标左左键时是否同是否同时按下了按下了CtrlCtrl键或或ShiftShift键,可以用以下程序段来,可以用以下程序段来处理:理:北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理case WM_ LBUTTONDOWNcase WM_ LBUTTONDO

29、WN:ifif(wParam&MK_CTROLwParam&MK_CTROL) /Ctrl/Ctrl键同同时按下按下if (wParam&MK_ SHIFT)if (wParam&MK_ SHIFT)/ Ctrl / Ctrl 键和和ShiftShift键都同都同时按下按下 / / 处理程序理程序 else else / Ctrl/ Ctrl健同健同时按下,但按下,但 ShiftShift键没有被按下没有被按下 . / . / 处理程序理程序 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠

30、标消息处理鼠标消息处理else ifelse if(wParam&MK_ SHIFTwParam&MK_ SHIFT) / Shift/ Shift键同同时按下,但按下,但 CtrlCtrl键没有被接下没有被接下 / / 处理程序理程序 elseelse / Shift / Shift 键和和CtrlCtrl键都未按下都未按下 / / 处理程序理程序 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理lParamlParam参数保存了消息参数保存了消息产生生时鼠鼠标所在点

31、的坐所在点的坐标,其中低,其中低1616位位为X X坐坐标,高,高1616位位为Y Y坐坐标。在在处理鼠理鼠标消息的消息的时候,如果需要候,如果需要处理鼠理鼠标双双击消息,消息,则在注册窗口在注册窗口类时,窗口的,窗口的风格必格必须包括包括CS_DBCLCKSCS_DBCLCKS。否。否则即使即使执行了双行了双击操作,窗口也只能收到两条操作,窗口也只能收到两条WM_ BUTTONUPWM_ BUTTONUP和和 WM_BUTTONDOWNWM_BUTTONDOWN消息。区分双消息。区分双击操作和两次操作和两次单击操作是操作是以两次以两次击键的的时间间隔隔为标准的。当两次准的。当两次击键的的时间

32、间隔隔小于小于 500500毫秒毫秒时, WindowsWindows将其将其视为双双击操作:如果两次操作:如果两次击键的的时间间隔大于隔大于500500毫秒,毫秒,WindowsWindows将其将其视为两次两次单击操作。操作。500500毫秒毫秒为默默认的的时间间隔,用隔,用户可以通可以通过调用用SetDoubleClickTimeSetDoubleClickTime函数来修改函数来修改这一一时间间隔。隔。SetDoubleClickTimeSetDoubleClickTime函数的原型定函数的原型定义如下:如下:BOOL SetDoubleClickTimeBOOL SetDoubleC

33、lickTime(UINT uInterval / UINT uInterval / 新的新的击键时间间隔)隔)北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理2 2鼠鼠标捕捉捕捉在通常情况下,只有当鼠在通常情况下,只有当鼠标位于窗体内位于窗体内时,窗体才能接收,窗体才能接收到鼠到鼠标的消息。如果需要接收所有的鼠的消息。如果需要接收所有的鼠标消息而不消息而不论鼠鼠标是否在窗口内,是否在窗口内,这时可以可以调用用SetCaptureSetCapture函数来函数来实现。S

34、etCaptureSetCapture函数的原型定函数的原型定义如下:如下: HWND SetCapture HWND SetCapture ( HWND hwnd / HWND hwnd / 窗口句柄窗口句柄 ););调用用SetCaptureSetCapture函数后,所有鼠函数后,所有鼠标操作所操作所产生的消息都直生的消息都直接接发送到指定窗口。因送到指定窗口。因为此此时鼠鼠标可能位于窗口之外,所可能位于窗口之外,所以鼠以鼠标的坐的坐标可能可能为负值。由于。由于调用用该函数会使其他窗口函数会使其他窗口不能接收到不能接收到键盘和鼠和鼠标的消息,因此在完成操作后的消息,因此在完成操作后应及及

35、时调用用ReleaseCapture ReleaseCapture 函数函数释放鼠放鼠标捕捕获。ReleaseCaptureReleaseCapture函数的原型定函数的原型定义如下如下 BOOL ReleaseCaptureBOOL ReleaseCapture(VOIDVOID););北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理3. VC+3. VC+中鼠中鼠标响响应事件事件 (1 1)OnLButtonDblClk OnLButtonDblClk :表示控件:

36、表示控件对双双击鼠鼠标左左键时的响的响应。语法法为: void Object1Wnd void Object1Wnd :OnLButtonDblClk( UINT OnLButtonDblClk( UINT nFlags, CPoint point ) nFlags, CPoint point ) (2 2)OnLButtonDownOnLButtonDown:表示控件:表示控件对按下鼠按下鼠标左左键时的响的响应。语法法为: void Object1Wndvoid Object1Wnd:OnLButtonDown( UINT OnLButtonDown( UINT nFlags, CPoint

37、 point )nFlags, CPoint point )北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理(3 3) OnLButtonUpOnLButtonUp:表示控件:表示控件对按下的鼠按下的鼠标左左键放放开后的响开后的响应。语法法为: void Object1Wndvoid Object1Wnd:OnLButtonUp( UINT OnLButtonUp( UINT nFlags, CPoint point ) nFlags, CPoint point ) (

38、4 4) OnRButtonDblClkOnRButtonDblClk:表示控件:表示控件对双双击鼠鼠标右右键时的响的响应。语法法为: void Object1Wnd void Object1Wnd :OnRButtonDblClk( UINT OnRButtonDblClk( UINT nFlags, CPoint point ) nFlags, CPoint point ) 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理(5) OnRButtonDown (5)

39、OnRButtonDown :表示控件:表示控件对按下鼠按下鼠标右右键时的响的响应。语法法为: void Object1Wndvoid Object1Wnd:OnRButtonDown( UINT OnRButtonDown( UINT nFlags, CPoint point ) nFlags, CPoint point ) (6)OnRButtonUp(6)OnRButtonUp:表示控件:表示控件对按下的鼠按下的鼠标右右键放开放开后的响后的响应。语法法为: void Object1Wnd void Object1Wnd :OnRButtonUp( UINT OnRButtonUp( UI

40、NT nFlags, CPoint point ) nFlags, CPoint point ) 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理其中的参数其中的参数 nFlags nFlags 用于指示按下的用于指示按下的键的代的代码,它可以是下面的几个它可以是下面的几个值或它或它们的的组合:合: MK_CONTROL MK_CONTROL 表示按下表示按下 CTRL CTRL 键 ; MK_LBUTTON MK_LBUTTON 表示按下鼠表示按下鼠标左左键; MK_

41、MBUTTON MK_MBUTTON 表示按下鼠表示按下鼠标中中键; MK_RBUTTON MK_RBUTTON 表示按下鼠表示按下鼠标右右键; MK_SHIFT MK_SHIFT 表示按下表示按下 SHIFT SHIFT 键; Point Point 参数表示鼠参数表示鼠标的光的光标位置相位置相对于所在窗口于所在窗口的左上角的水平和垂直坐的左上角的水平和垂直坐标值。 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理在在 VC VC 中用鼠中用鼠标响响应事件来完成人机交

42、互中的控事件来完成人机交互中的控制功能是比制功能是比较容易的。例如把一个控件容易的。例如把一个控件 Object1 Object1 的位置移的位置移动到鼠到鼠标光光标的位置,下面的位置,下面简单的程序的程序就可完成:就可完成: void Object1:OnLButtonDown(UINT nFlags, CPoint void Object1:OnLButtonDown(UINT nFlags, CPoint point) point) CPoint Position;CPoint Position;Position = point; Position = point; Object1-le

43、ft=Position.x; Object1-left=Position.x; Object1-top=Position.y; / Object1-top=Position.y; / 按下鼠按下鼠标左左键后控件的后控件的水平和垂直方向的水平和垂直方向的值 /分分别与鼠与鼠标的光的光标位置一致位置一致 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理MFC MFC 提供的提供的 API LoadBitmap API LoadBitmap 、LoadImage LoadImage 类 CBitmap CBitmap

44、等都只能操作等都只能操作 BMP BMP 位位图、图标。对于其于其他常用的他常用的 JPG JPG 、JPEGJPEG、 GIFGIF、 PNG PNG 格式都无能格式都无能为力。力。VC VC 下怎下怎样才能加才能加载各种非各种非 BMP BMP 格式的格式的图片呢?下面介片呢?下面介绍一种最一种最简单的的办法。用法。用 CImage CImage 类的的 Load Load 函数加函数加载图片,之后用片,之后用 Detach Detach 取得取得 HBITMAP HBITMAP 句柄。取得句柄。取得图片的片的HBITMAP HBITMAP 句柄后就可句柄后就可以像操作以像操作 BMP B

45、MP 图片一片一样处理理 JPGJPG、JPEGJPEG、GIFGIF、PNGPNG格式的格式的图片了。具体代片了。具体代码如下:如下:北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理用用 CImage CImage 类的的 Load Load 函数加函数加载图片,之后用片,之后用 Detach Detach 取得取得 HBITMAP HBITMAP 句柄。取得句柄。取得图片的片的HBITMAP HBITMAP 句柄后就可以像操作句柄后就可以像操作 BMP BMP 图片一片一样处理理 JPGJPG、JPEGJPE

46、G、GIFGIF、PNGPNG格式的格式的图片了。具体代片了。具体代码如下:如下:#include “atlimage.h”#include “atlimage.h”CImage img;CImage img;HRESULT ret = img.Load(); / HRESULT ret = img.Load(); / 是要加是要加载的文的文件名(包含路径)件名(包含路径)HBITMAP bitmap = img.Detach(); /HBITMAP bitmap = img.Detach(); /像操作像操作 BMP BMP 图片一片一样处理理图片片除了以上除了以上这种最种最简单的方法外,加

47、的方法外,加载非非BMPBMP格式格式图片片还有其他方法,下面介有其他方法,下面介绍几种另外的方法。几种另外的方法。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理2.4.12.4.1加载加载jpgjpg如片的方法如片的方法MFCMFC提供的提供的CWndCWnd类只有默只有默认加加载BMPBMP文件的接口,文件的接口,对JPGJPG等格式等格式图像是不支持的,而像是不支持的,而实际中中经常需要用常需要用到非到非BMPBMP的的图片,在片,在VCVC中加中加载.JPG.JPG格式的格式的图片,有片,有两种方法:两

48、种方法:(1 1)利用流)利用流对象加象加载图像像( (参考教材源程序参考教材源程序) )(2 2)利用)利用IPictureIPicture接口来加接口来加载图像像( (参考教材源程序参考教材源程序) )北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理2.4.22.4.2用用GDI+GDI+把图片转成把图片转成.BMP.BMP文件再加载文件再加载在在StdAfx.hStdAfx.h中静中静态调用用gdiplus.libgdiplus.lib,即由,即由编译系系统完成完成对DLLDLL的加的加载,应用程序用程序结

49、束束时卸卸载DLLDLL的的编码。实现步步骤如下所示:如下所示:#ifndef ULONG_PTR#ifndef ULONG_PTR#define ULONG_PTR unsigned long*#define ULONG_PTR unsigned long*#include GdiPlus.h#include GdiPlus.husing namespace Gdiplus;using namespace Gdiplus;#pragma comment(lib,gdiplus.lib)#pragma comment(lib,gdiplus.lib)#endif#endif 北华航天工业学院计

50、算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理2.4.22.4.2用用GDI+GDI+把图片转成把图片转成.BMP.BMP文件再加载文件再加载在在类的的头文件中定文件中定义,以下成,以下成员变量,用来初始量,用来初始化化GDI+GDI+的使用和的使用和结束使用束使用GdiplusStartupInput GdiplusStartupInput m_gdiplusStartupInput;m_gdiplusStartupInput;ULONG_PTR m_gdiplusToken; ULONG_PTR m_gdiplusToken

51、; 在初始化函数中,初始化在初始化函数中,初始化GDI+GDI+。如:在。如:在OnCreateOnCreate()()函数中加入初始化函数中加入初始化GDI+GDI+的函数:的函数:diplusStartup(&m_gdiplusToken, diplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL); &m_gdiplusStartupInput, NULL); 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理2.4.22.4.2用用GDI+GDI

52、+把图片转成把图片转成.BMP.BMP文件再加载文件再加载对应的在的在OnDestroy()OnDestroy()函数中加入函数中加入结束束GDI+GDI+使用的函使用的函数:数: GdiplusShutdown(m_gdiplusToken); GdiplusShutdown(m_gdiplusToken); 接着,就可以使用接着,就可以使用GDI+GDI+了,写一个如下的方法:了,写一个如下的方法:HBITMAP ReturnHBITMAP(CString )HBITMAP ReturnHBITMAP(CString )/可能是可能是bmpbmp、dibdib、pngpng、gifgif、

53、jpeg/jpgjpeg/jpg、tifftiff、emfemf等文等文件的文件名件的文件名 BitmaptempBmp();BitmaptempBmp();Color backColor;Color backColor;HBITMAP HBitmap;HBITMAP HBitmap;tempBmp.GetHBITMAP(backColor,&HBitmap);tempBmp.GetHBITMAP(backColor,&HBitmap);return HBitmap;return HBitmap; 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.

54、4 VC+对图片的处理对图片的处理2.4.32.4.3其他方法其他方法在在WM5.0+VC8.0WM5.0+VC8.0的的环境下,境下,还可以可以COMCOM(组件)的件)的方式加方式加载图片,片,这种方法能加种方法能加载的的图片格式比片格式比较全(全(.jpg,.png,.gif.jpg,.png,.gif),在),在Windows CE Windows CE Toolswce500Windows Mobile 5.0 Pocket PC Toolswce500Windows Mobile 5.0 Pocket PC SDKSamplesCPPWin32ImagingSDKSamplesCP

55、PWin32Imaging例子中,用例子中,用这个个COMCOM可以加可以加载皮肤,有皮肤,有兴趣的趣的读者可以者可以试一下。一下。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.52.5实现步骤实现步骤请参考教材,运行效果如参考教材,运行效果如图2-32-3所示。所示。图图2-3 自制屏幕保护程序效果图自制屏幕保护程序效果图北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.62.6本章小结本章小结本本实例介例介绍了屏幕保了屏幕保护基本原理、基本原理、绘图效率的提效率的提高、高、VC+VC+中中对鼠鼠标的控制以及的控制以及VC+VC+中加中加载图片的片的方法。方法。本例可以加本例可以加载自己喜自己喜欢的的图片及文字作片及文字作为屏幕保屏幕保护,但是,但是仅实现了非常了非常简单的屏幕保的屏幕保护程序,例程序,例如它只使用了如它只使用了简单的加的加载图片的方法,加片的方法,加载图片片时没有加没有加载相相应的音的音乐等。等。读者可以根据自己的者可以根据自己的需要,参看需要,参看联机帮助机帮助进行行补充和完善。充和完善。北华航天工业学院计算机系 制作Windows屏幕保护程序

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号