第2章Windows屏幕保护程序_第1页
第2章Windows屏幕保护程序_第2页
第2章Windows屏幕保护程序_第3页
第2章Windows屏幕保护程序_第4页
第2章Windows屏幕保护程序_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

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

5、保护程序主要有两个作用: (1)(1)避免长时间显示同一画面,损坏显示器。避免长时间显示同一画面,损坏显示器。 (2)(2)避免屏幕上机密信息的泄露。避免屏幕上机密信息的泄露。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.12.2.1显示的图形为什么会闪烁显示的图形为什么会闪烁绘图过程大多放在绘图过程大多放在OnDrawOnDraw()函数或者()函数或者OnPaintOnPaint()()函数中,函数中,OnDrawOnDraw()函数在进行屏幕显示时是由()函数在进行屏幕显示时是由OnPaintOnPain

6、t()函数进行调用的。当窗口由于任何原()函数进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,因需要重绘时,总是先用背景色将显示区清除,然后才调用然后才调用OnPaintOnPaint函数,而背景色往往与绘图内函数,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。的交替出现,使得显示窗口看起来在闪。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.12.2.1显示的图形为什么会闪烁显示的图形为什么会闪烁

7、简单图形之所以看起来没有复杂图形那么闪是因简单图形之所以看起来没有复杂图形那么闪是因为复杂图形占的面积大,重画时造成的反差比较为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率大,所以感觉上要闪得厉害一些,但是闪烁频率要低。要低。那为什么动画的重画频率高,而看起来却不闪?那为什么动画的重画频率高,而看起来却不闪?因为闪烁就是反差,反差越大,闪烁越厉害。而因为闪烁就是反差,反差越大,闪烁越厉害。而动画的连续两个帧之间的差异很小所以看起来不动画的连续两个帧之间的差异很小所以看起来不闪。因此动画的重画频率虽然很高,但看起来却闪。因此动画的重画频率虽然很高,但看起来却

8、不闪。但如果在动画的每一帧中间加一张纯白的不闪。但如果在动画的每一帧中间加一张纯白的帧,结果就不一样了。帧,结果就不一样了。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.22.2.2如何避免闪烁如何避免闪烁窗口形成时给窗口的注册类的背景刷赋值为窗口形成时给窗口的注册类的背景刷赋值为NULLNULL也可以在形成以后修改背景也可以在形成以后修改背景可以重载可以重载OnEraseBkgnd(CDCOnEraseBkgnd(CDC* * pDCpDC) )函数,直接函数,直接返回返回TRUETRUE这样背景没有了,结果

9、图形显示的确不闪了,但这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团乱。是显示也象前面所说的一样,变得一团乱。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.22.2.2如何避免闪烁如何避免闪烁为了更好的解决屏幕闪烁的问题,就要用到双缓为了更好的解决屏幕闪烁的问题,就要用到双缓存的方法。双缓冲就是除了在屏幕上有图形进行存的方法。双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。可以把要显示以外,在内存中也有图形在绘制。可以把要显示的图形先在内存中绘制好,然后再一次性的

10、显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当大的背景色进行清除都不会闪,因为看不见。当复制到屏幕上时,因为内存中最终的图形与屏幕复制到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小,这样看起来屏幕就不会闪。显示图形差别很小,这样看起来屏幕就不会闪。北华航天工业学院计算机系 制作单击此处编辑母版标题样式

11、单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现首先给出实现的程序,在首先给出实现的程序,在OnDraw(CDCOnDraw(CDC * *pDCpDC) )函数函数中添加如下代码:中添加如下代码:CDC CDC MemDCMemDC; /; /首先定义一个显示设备对首先定义一个显示设备对象象CBitmapCBitmap MemBitmapMemBitmap; /; /定义一个位图对象定义一个位图对象/建立与屏幕显示兼容的内存显示设备建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(NULLMemD

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

13、内存显示设备中/只有选入了位图的内存显示设备才有地方绘图,只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上画到指定的位图上CBitmapCBitmap * *pOldBitpOldBit= =MemDC.SelectObject(&MemBitmapMemDC.SelectObject(&MemBitmap););北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现/先用背景色将位图清除干净,以白色为例先用背景色将位图清除干净,以白色为例MemDC.FillSolidRe

14、ct(0,0,nWidth,nHeight,RGB(2MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255);55,255,255);/绘图绘图MemDC.MoveToMemDC.MoveTo();();MemDC.LineToMemDC.LineTo();();北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现/将内存中的图拷贝到屏幕上进行显示将内存中的图拷贝到屏幕上进行显示pDCpDC- -BitBlt(0,0,nWid

15、th,nHeight,&MemDC,0,0,SRCCBitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);OPY);/绘图完成后的清理绘图完成后的清理MemBitmap.DeleteObjectMemBitmap.DeleteObject();();MemDC.DeleteDCMemDC.DeleteDC();();北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.22.2如何提高绘图效率如何提高绘图效率2.2.32.2.3双缓冲的实现双缓冲的实现其中,函数其中,函数BitBltBitBlt是对指定的源设备环境区域中是对指定

16、的源设备环境区域中的像素进行位块(的像素进行位块(bit_blockbit_block)转换,以传送到目)转换,以传送到目标设备环境。标设备环境。函数原型:函数原型:BOOL BOOL BitBlt(HDCBitBlt(HDC hdcDest,inthdcDest,int nXDest,intnXDest,int nYDest,intnYDest,int nWidth,intnWidth,int nHeight,HDCnHeight,HDC hdcSrchdcSrc, , intint nXSrc,intnXSrc,int nYSrc,DWORDnYSrc,DWORD dwRopdwRop)

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

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

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

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

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

22、MFC设置的,设置的,它已经为我们提高了显示效率,在进行复杂图形它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用在裁剪区外的绘图过程了。可以先用pDCpDC- - GetClipBoxGetClipBox()得到裁剪区,然后在绘图时判断()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就你的图形是否在这个区内,如果在就画,不在就不画。不画。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的

23、处理2.3.12.3.1鼠标消息处理流程鼠标消息处理流程当用户在画板上按下鼠标时,当用户在画板上按下鼠标时,WINDOWSWINDOWS将鼠标消息将鼠标消息放在主框架窗口消息队列中放在主框架窗口消息队列中MFCMFC接收到此消息后,接收到此消息后,先将其转化,然后最先传送鼠标消息给视图对象,先将其转化,然后最先传送鼠标消息给视图对象,若视图类没有在视图类消息映射表中对此消息进若视图类没有在视图类消息映射表中对此消息进行映射(即视图没有提供处理器),则行映射(即视图没有提供处理器),则MFCMFC重发消重发消息给文档对象。若文档类消息映射表中没有对此息给文档对象。若文档类消息映射表中没有对此消息

24、进行映射,则消息进行映射,则MFCMFC重发该消息给主窗口类处理,重发该消息给主窗口类处理,若主窗口也没有,则发给应用程序。若还没有映若主窗口也没有,则发给应用程序。若还没有映射处理,则按缺省处理。射处理,则按缺省处理。 因此,应在视图中添加因此,应在视图中添加鼠标消息处理函数。鼠标消息处理函数。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理1. 鼠标消息 WindowsWindows定义的鼠标消息共有定义的鼠标消息共有2020条,其中非编条,其中非编辑区的鼠标消息一

25、般交由系统处理,程序只处理辑区的鼠标消息一般交由系统处理,程序只处理编辑区内的鼠标消息。编辑区内的鼠标消息共有编辑区内的鼠标消息。编辑区内的鼠标消息共有1010条:条:WM_MOUSEMOVE WM_MOUSEMOVE 移动鼠标移动鼠标WM_LBUTTONDOWN WM_LBUTTONDOWN 按下鼠标左键按下鼠标左键WM_LBUTTONUP WM_LBUTTONUP 释放鼠标左键释放鼠标左键WM_LBUTTONDBLCLK WM_LBUTTONDBLCLK 双击鼠标左键双击鼠标左键WM_RBUTTONDBLCLK WM_RBUTTONDBLCLK 按下鼠标右键按下鼠标右键WM_RBUTTON

26、UP WM_RBUTTONUP 释放鼠标右键释放鼠标右键WM_RBUTTONDBLCLK WM_RBUTTONDBLCLK 双击鼠标右键双击鼠标右键WM_MBUTTONDOWM WM_MBUTTONDOWM 按下鼠标中键按下鼠标中键WM_MBUTTONUP WM_MBUTTONUP 释放鼠标中键释放鼠标中键WM_MBUTTONDBLCLK WM_MBUTTONDBLCLK 双击鼠标中键双击鼠标中键北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理对于上面所列的鼠标操作中的

27、最后两种,不能直对于上面所列的鼠标操作中的最后两种,不能直接使用接使用WindowsWindows定义的消息来判断,只能通过编程,定义的消息来判断,只能通过编程,将多种消息和数据组合之后判断。例如,判断用将多种消息和数据组合之后判断。例如,判断用户是否按下鼠标左键之后进行拖动操作可以通过户是否按下鼠标左键之后进行拖动操作可以通过以下程序段来实现,用以下程序段来实现,用casecase语句来实现:语句来实现:case WM_MOUSEMOVEcase WM_MOUSEMOVE:if (if (wParam&MK_LBUTTONwParam&MK_LBUTTON) /) /只处理鼠标拖动的消只处理

28、鼠标拖动的消息息 / / 处理程序处理程序 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理 在处理鼠标消息的过程中,消息的在处理鼠标消息的过程中,消息的wParamwParam参数和参数和lParamlParam参参数起了重要的作用。数起了重要的作用。wParamwParam参数中保存了在消息产生时其参数中保存了在消息产生时其他操作进行的状态;用户可以通过位屏蔽操作来判断在该他操作进行的状态;用户可以通过位屏蔽操作来判断在该消息产生的同时,其余操作是否正在进行。这正是

29、在程序消息产生的同时,其余操作是否正在进行。这正是在程序中判断复杂鼠标操作的基本方法。例如,上面判断拖动操中判断复杂鼠标操作的基本方法。例如,上面判断拖动操作的程序段就用了位操作作的程序段就用了位操作 wParamwParam MK_LBUTTON, MK_LBUTTON, 判断在判断在鼠标移动(鼠标移动(WM_MOUSEMOVEWM_MOUSEMOVE)的同时鼠标左键是否同时被接)的同时鼠标左键是否同时被接下。如果,鼠标左键同时按下,则位操作的结果为下。如果,鼠标左键同时按下,则位操作的结果为TRUETRUE,说明当前操作为拖动操作,程序可以继续进行下一步处理。说明当前操作为拖动操作,程序可

30、以继续进行下一步处理。又如需要判断单击鼠标左键时是否同时按下了又如需要判断单击鼠标左键时是否同时按下了CtrlCtrl键或键或ShiftShift键,可以用以下程序段来处理:键,可以用以下程序段来处理:北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理case WM_ LBUTTONDOWNcase WM_ LBUTTONDOWN:ifif(wParam&MK_CTROLwParam&MK_CTROL) /Ctrl/Ctrl键同时按下键同时按下if (if (wParam

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

32、ft/ Shift键同时按下,但键同时按下,但 CtrlCtrl键没有被接下键没有被接下 / / 处理程序处理程序 elseelse / Shift / Shift 键和键和CtrlCtrl键都未按下键都未按下 / / 处理程序处理程序 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理 lParamlParam参数保存了消息产生时鼠标所在点的坐标,其中低参数保存了消息产生时鼠标所在点的坐标,其中低1616位为位为X X坐标,高坐标,高1616位为位为Y Y坐标。坐标。

33、在处理鼠标消息的时候,如果需要处理鼠标双击消息,则在处理鼠标消息的时候,如果需要处理鼠标双击消息,则在注册窗口类时,窗口的风格必须包括在注册窗口类时,窗口的风格必须包括CS_DBCLCKSCS_DBCLCKS。否则。否则即使执行了双击操作,窗口也只能收到两条即使执行了双击操作,窗口也只能收到两条WM_ BUTTONUPWM_ BUTTONUP和和 WM_BUTTONDOWNWM_BUTTONDOWN消息。区分双击操作和两次单击操作是消息。区分双击操作和两次单击操作是以两次击键的时间间隔为标准的。当两次击键的时间间隔以两次击键的时间间隔为标准的。当两次击键的时间间隔小于小于 500500毫秒时,

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

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

36、ptureSetCapture函数来实现。函数来实现。SetCaptureSetCapture函数的原型定义如下:函数的原型定义如下: HWND HWND SetCaptureSetCapture ( HWND HWND hwndhwnd / / 窗口句柄窗口句柄 );); 调用调用SetCaptureSetCapture函数后,所有鼠标操作所产生的消息都直函数后,所有鼠标操作所产生的消息都直接发送到指定窗口。因为此时鼠标可能位于窗口之外,所接发送到指定窗口。因为此时鼠标可能位于窗口之外,所以鼠标的坐标可能为负值。由于调用该函数会使其他窗口以鼠标的坐标可能为负值。由于调用该函数会使其他窗口不能

37、接收到键盘和鼠标的消息,因此在完成操作后应及时不能接收到键盘和鼠标的消息,因此在完成操作后应及时调用调用ReleaseCaptureReleaseCapture 函数释放鼠标捕获。函数释放鼠标捕获。ReleaseCaptureReleaseCapture函数的原型定义如下函数的原型定义如下 BOOL BOOL ReleaseCaptureReleaseCapture(VOIDVOID););北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理3. VC+3. VC+中鼠标响

38、应事件中鼠标响应事件 (1 1)OnLButtonDblClkOnLButtonDblClk :表示控件对双击鼠标左:表示控件对双击鼠标左键时的响应。语法为:键时的响应。语法为: void Object1Wnd void Object1Wnd :OnLButtonDblClkOnLButtonDblClk( UINT ( UINT nFlagsnFlags, , CPointCPoint point ) point ) (2 2)OnLButtonDownOnLButtonDown:表示控件对按下鼠标左键时:表示控件对按下鼠标左键时的响应。语法为:的响应。语法为: void Object1Wn

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

40、uttonUpOnLButtonUp( UINT ( UINT nFlagsnFlags, , CPointCPoint point ) point ) (4 4) OnRButtonDblClkOnRButtonDblClk:表示控件对双击鼠标右:表示控件对双击鼠标右键时的响应。语法为:键时的响应。语法为: void Object1Wnd void Object1Wnd :OnRButtonDblClkOnRButtonDblClk( UINT ( UINT nFlagsnFlags, , CPointCPoint point ) point ) 北华航天工业学院计算机系 制作单击此处编辑母

41、版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理(5) (5) OnRButtonDownOnRButtonDown :表示控件对按下鼠标右键时:表示控件对按下鼠标右键时的响应。语法为:的响应。语法为: void Object1Wndvoid Object1Wnd:OnRButtonDownOnRButtonDown( UINT ( UINT nFlagsnFlags, , CPointCPoint point ) point ) (6)OnRButtonUp(6)OnRButtonUp:表示控件对按下的鼠标右键

42、放开:表示控件对按下的鼠标右键放开后的响应。语法为:后的响应。语法为: void Object1Wnd void Object1Wnd :OnRButtonUpOnRButtonUp( UINT ( UINT nFlagsnFlags, , CPointCPoint point ) point ) 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理其中的参数其中的参数 nFlagsnFlags 用于指示按下的键的代码,用于指示按下的键的代码,它可以是下面的几个值或它们的组

43、合:它可以是下面的几个值或它们的组合: MK_CONTROL MK_CONTROL 表示按下表示按下 CTRL CTRL 键键 ; MK_LBUTTON MK_LBUTTON 表示按下鼠标左键;表示按下鼠标左键; MK_MBUTTON MK_MBUTTON 表示按下鼠标中键;表示按下鼠标中键; MK_RBUTTON MK_RBUTTON 表示按下鼠标右键;表示按下鼠标右键; MK_SHIFT MK_SHIFT 表示按下表示按下 SHIFT SHIFT 键;键; Point Point 参数表示鼠标的光标位置相对于所在窗口参数表示鼠标的光标位置相对于所在窗口的左上角的水平和垂直坐标值。的左上角的

44、水平和垂直坐标值。 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.3 VC+2.3 VC+中鼠标的处理中鼠标的处理2.3.22.3.2鼠标消息处理鼠标消息处理在在 VC VC 中用鼠标响应事件来完成人机交互中的控中用鼠标响应事件来完成人机交互中的控制功能是比较容易的。例如把一个控件制功能是比较容易的。例如把一个控件 Object1 Object1 的位置移动到鼠标光标的位置,下面简单的程序的位置移动到鼠标光标的位置,下面简单的程序就可完成:就可完成: void Object1:OnLButtonDown(UINT void Object1:OnLButton

45、Down(UINT nFlagsnFlags, , CPointCPoint point) point) CPointCPoint Position; Position;Position = point; Position = point; Object1-left=Object1-left=Position.xPosition.x; ; Object1-top=Object1-top=Position.yPosition.y; / ; / 按下鼠标左键后控件的按下鼠标左键后控件的水平和垂直方向的值水平和垂直方向的值 /分别与鼠标的光标位置一致分别与鼠标的光标位置一致 北华航天工业学院计算机系

46、 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理MFC MFC 提供的提供的 API API LoadBitmapLoadBitmap 、LoadImageLoadImage 类类 CBitmapCBitmap 等都只能操作等都只能操作 BMP BMP 位图、图标。对于其位图、图标。对于其他常用的他常用的 JPG JPG 、JPEGJPEG、 GIFGIF、 PNG PNG 格式都无能格式都无能为力。为力。VC VC 下怎样才能加载各种非下怎样才能加载各种非 BMP BMP 格式的图格式的图片呢?下面介绍一种最简单的办法。用片呢?下面介

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

48、Image 类的类的 Load Load 函数加载图片,之后用函数加载图片,之后用 Detach Detach 取得取得 HBITMAP HBITMAP 句柄。取得图片的句柄。取得图片的HBITMAP HBITMAP 句柄后就可以像操作句柄后就可以像操作 BMP BMP 图片一样处理图片一样处理 JPGJPG、JPEGJPEG、GIFGIF、PNGPNG格式的图片了。具体代码如格式的图片了。具体代码如下:下:#include “#include “atlimage.hatlimage.h”CImageCImage imgimg; ;HRESULT ret = HRESULT ret = img

49、.Load(filenameimg.Load(filename); / ); / filename filename 是要加载的文件名(包含路径)是要加载的文件名(包含路径)HBITMAP bitmap = HBITMAP bitmap = img.Detachimg.Detach(); /(); /像操作像操作 BMP BMP 图片一样处理图片图片一样处理图片除了以上这种最简单的方法外,加载非除了以上这种最简单的方法外,加载非BMPBMP格式图格式图片还有其他方法,下面介绍几种另外的方法。片还有其他方法,下面介绍几种另外的方法。北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编

50、辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理2.4.12.4.1加载加载jpgjpg如片的方法如片的方法MFCMFC提供的提供的CWndCWnd类只有默认加载类只有默认加载BMPBMP文件的接口,文件的接口,对对JPGJPG等格式图像是不支持的,而实际中经常需要等格式图像是不支持的,而实际中经常需要用到非用到非BMPBMP的图片,在的图片,在VCVC中加载中加载.JPG.JPG格式的图片,格式的图片,有两种方法:有两种方法:(1 1)利用流对象加载图像)利用流对象加载图像( (参考教材源程序参考教材源程序) )(2 2)利用)利用IPictureIPicture接口来加载

51、图像接口来加载图像( (参考教材源程参考教材源程序序) )北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处理对图片的处理2.4.22.4.2用用GDI+GDI+把图片转成把图片转成.BMP.BMP文件再加载文件再加载在在StdAfx.hStdAfx.h中静态调用中静态调用gdiplus.libgdiplus.lib,即由编译,即由编译系统完成对系统完成对DLLDLL的加载,应用程序结束时卸载的加载,应用程序结束时卸载DLLDLL的编码。实现步骤如下所示:的编码。实现步骤如下所示:# #ifndefifndef ULONG_PT

52、R ULONG_PTR#define ULONG_PTR unsigned long#define ULONG_PTR unsigned long* *#include #include GdiPlus.hGdiPlus.h using namespace using namespace GdiplusGdiplus; ;#pragma comment(lib, gdiplus.lib)#pragma comment(lib, gdiplus.lib)# #endifendif 北华航天工业学院计算机系 制作单击此处编辑母版标题样式单击此处编辑母版标题样式2.4 VC+2.4 VC+对图片的处

53、理对图片的处理2.4.22.4.2用用GDI+GDI+把图片转成把图片转成.BMP.BMP文件再加载文件再加载在类的头文件中定义,以下成员变量,用来初始在类的头文件中定义,以下成员变量,用来初始化化GDI+GDI+的使用和结束使用的使用和结束使用GdiplusStartupInputGdiplusStartupInput m_gdiplusStartupInputm_gdiplusStartupInput; ;ULONG_PTR ULONG_PTR m_gdiplusTokenm_gdiplusToken; ; 在初始化函数中,初始化在初始化函数中,初始化GDI+GDI+。如:在。如:在OnCreateOnCreate()()函数中加入初始化函数中加入初始化GDI+G

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论