预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共58页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第4讲鼠标、键盘编程第4讲鼠标、键盘编程4鼠标、键盘编程4.1鼠标消息及其处理4.1鼠标消息及其处理4.1.1客户区鼠标消息常用的客户区鼠标消息及消息说明MFC把客户区鼠标消息的处理函数封装在Cwnd类中,这些函数都是虚函数。 客户区鼠标消息处理函数的一般形式为: voidOnXxxYyy(UINTnFlag,CPointpoint); 如OnLButtonDown函数为消息WM_LBUTTONDOWN的消息处理函数,其声明如下: voidOnLButtonDown(UINTnFlag,CPointpoint); 函数的两个参数说明如下: nFlags:为鼠标动作的条件标志。 point:为CPoint类对象,记录了当前光标的x,y坐标,这个坐标是以相对于窗口客户区左上角的设备坐标而言的。鼠标可以和<shift>或<ctrl>键组合使用。 nFlags的取值是以下各种取值的组合,各取值含义如下: MK_LBUTTON:按下了鼠标的左键。 MK_MBUTTON:按下了鼠标的中键。 MK_RBUTTON:按下了鼠标的右键。 MK_CONTROL:按下了键盘上的Ctrl键。 MK_SHIFT:按下了键盘上的Shift键。 以上这些取值均为某一位为1其余位全0的值。 在实际编程中,常使用nFlags参数与以上可能取值进行位与运算,来判断消息生成时的鼠标键以及Shift以及Ctrl的状态。4.1.2非客户区鼠标消息常见的非客户区鼠标消息及消息说明4.1.3鼠标捕捉实现鼠标的捕捉的SetCapture函数的原型如下: HWNDSetCapture(HWNDhWnd); hWnd为要捕捉鼠标消息的窗口句柄。 如果在程序中执行如下语句: SetCapture(hWnd); 这将导致Windows向窗口句柄为hWnd的窗口发送所有的鼠标消息。 注意:一旦某个窗口捕获了鼠标,其他窗口将无法得到鼠标消息,因此,当窗口不再需要捕获鼠标消息时,应及时使用ReleaseCapture函数将鼠标释放。4.1.4鼠标光标及其处理4.1.4鼠标光标及其处理1.创建光标编辑设计光标窗口2.载入光标(1)载入系统标准光标(2)载入自定义光标首先需要声明一个HCURSOR成员变量,如下: HCURSORm_cursor; 在PreCreateWindow()函数中,将自定义的光标赋于m_cursor,代码如下: m_cursor=(HCURSOR)::LoadImage( cs.hInstance, MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 32,32, LR_CREATEDIBSECTION ); 注:IDC_CURSOR1为创建的光标资源的资源ID。 在需要使用该光标时,就可以使用如下语句调用该光标: SetCursor(m_cursor);4.1.5鼠标处理编程实例运行结果:锁定鼠标在一定范围如,要将鼠标锁定在某一固定区域,可采用如下的实现代码: RECTrcClip;//限制矩形区域 RECTrcOldClip;//原先的鼠标活动区域 //获取原鼠标活动的有效区域到rcOldClip中。 GetClipCursor(&rcOldClip); rcClip.left=10;//设置锁定区域大小 rcClip.top=10; rcClip.right=200; rcClip.bottom=200; if(ClipCursor(&rcClip))//限制鼠标移动区域 { MessageBox(“鼠标固定在指定区域”); }如果需要将鼠标锁定在某一个窗口,可采用下面的代码: RECTrcClip; RECTrcOldClip;//原先的鼠标活动区域 //获取原鼠标活动的有效区域rcOldClip中。 GetClipCursor(&rcOldClip); //获取窗口活动区域到rcClip GetWindowRect(hWnd,&rcClip); ClipCursor(&rcClip); 而如果要解除锁定,则只需恢复原来的鼠标作用的有效区域即可: ClipCursor(&rcOldClip);程序分析:(3)虽然限制鼠标的活动区域在客户窗口,但是鼠标仍然可以移动到客户窗口的边界处(是非客户区),此时如果释放鼠标左键,将无法响应鼠标消息WM_LBUTTONUP,也就不能执行OnLButtonUp()函数恢复鼠标的活动区域。因而鼠标的活动区域就被限制在客户窗口,无法进行其他操作。要解决这个问题,可以在OnLButtonDown()函数中,调用API函数SetCapture()捕捉鼠标,这样,不论鼠标在何位置,该窗口程序都能捕获其消息WM_LBUTTONUP。当鼠标的活动区域恢复后,调用API函数ReleaseCapture()