chateau citran:[VC] 鼠标事件的响应

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 17:36:27


鼠标键包括左键、右键和中键(滚轮),每个键都有三种事件消息,一是被按下,二是被释放,三是双击。下表列出了鼠标操作、消息名称及处理函数名。
 鼠标操作 消息名称  处理函数名 
 左键按下  WM_LBUTTONDOWN  OnLButtonDown
 左键释放  WM_LBUTTONUP  OnLButtonUp
 左键双击  WM_LBUTTONDBCLK  OnLButtonDbClk
 右键按下  WM_RBUTTONDOWN  OnRButtonDown
 右键释放  WM_RBUTTONUP  OnRButtonUp
 右键双击  WM_RBUTTONDBCLK  OnRButtonDbClk
 鼠标移动  WM_MOUSEMOVE  OnMouseMove
 滚轮移动  WM_MOUSEWHEEL  OnMouseWheel

下面说一下几个消息响应函数的原型(MFC下的)
按键按下和释放以及鼠标移动的原型是一样的,参数的意义也都一样,以左键按下为例。
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
nFlags表示鼠标、Shift键和Ctrl键的状态组合,可以有如下情况:
 标识符  功能描述
 MK_CONTROL  Ctrl键被按下
 MK_LBUTTON  鼠标左键被按下
 MK_MBUTTON  鼠标中键被按下
 MK_RBUTTON  鼠标右键被按下
 MK_SHIFT  Shift键被按下

当键被按下时,对应的标识符的值就为真。例如,在左键按下的响应中,如果Ctrl键同时被按下了,那么MK_CONTROL值为真,这样可以通过与操作及或操作来定义任意的按键组合。
point包含了无懈可击当前位置相对于屏幕左上角的X和Y坐标值。
滚轮的响应函数与上面的响应函数略有不同。
afx_msg void OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
nFlags和pt参数的含义同前面的nFlags和point,只说一下zDelta。
zDelta表示滚轮滚动的距离,是WHEEL_DELTA(被设定为120)的倍数,正数时,表示滚轮向前运动(离开用户的方向,我们通常说的向上),负数时则相反。
这个WHEEL_DELTA是动作能否被响应的一个阈值。滚轮每滚过一个这样的距离才能响应一次。之所以设定WHEEL_DELTA,是为适应将来可能出现的高分辨率的甚至是可以自由滚动的滚轮而设计的。
 
再说一下关于鼠标的捕获
在上面的介绍中,我们提到了鼠标的按下和释放。如果我们在程序的窗口区按下鼠标,移出窗口后再释放鼠标,这时这个释放鼠标的操作就会丢失。就是说,如果没有采用鼠标捕获的话,当鼠标在你的客户区内的时候,你可以得到鼠标的消息,当它移出你的客户之后,你就得到到鼠标的消息了。为防止这种情况的发生,可以采用鼠标捕获的技术。
在鼠标开始使用时用SetCapture函数捕获鼠标,当鼠标退出是用ReleaseCapture函数释放捕获。通常会在OnLButtonDown里捕获鼠标,在OnLButtonUp里释放捕获。
使用鼠标捕获时还必须注意的一点是系统中只能有一个程序调用SetCapture,在不使用时必须调用ReleaseCapture释放。而GetCapture可以知道当前哪个窗口调用了SetCapture。
void SetCapture();
void ReleaseCapture();
调用ReleaseCapture时会产生一个WM_CAPTURECHANGED的消息