当前位置:文档之家› [VC] 鼠标事件的响应

[VC] 鼠标事件的响应

鼠标键包括左键、右键和中键(滚轮),每个键都有三种事件消息,一是被按下,二是被释放,三是双击。

下表列出了鼠标操作、消息名称及处理函数名。

鼠标操作消息名称处理函数名
左键按下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的消息。

相关主题