第五章已经讲到,Windows只会把键盘消息发送到当前具有输入焦点的窗口。鼠标消息则不同:当鼠标经过窗口或在窗口内被单击,则即使该窗口是非活动窗口或不带输入焦点, 窗口过程还是会收到鼠标消息。Windows定义了 21种鼠标消息。不过,其中11种消息与 客户区无关,称为“非客户区消息”。Windows应用程序经常忽略这类消息。
本节必须掌握的知识点:
客户区鼠标消息
第35练:客户区鼠标消息的处理
6.2.1 客户区鼠标消息
■客户区鼠标消息
当鼠标移经窗口客户区时,窗口过程接收WM_MOUSEMOVE消息。在窗口客户区内按下或释放鼠标按钮时,窗口过程接收如下表所示的消息:
按钮 |
按下 |
释放 |
第二次按下按钮 |
左键 |
WM_LBUTTONDOWN |
WM_LBUTTONUP |
WM_LBUTTONDBLCLK |
中键 |
WM_MBUTTONDOWN |
WM_MBUTTONUP |
WM_MBUTTONDBLCLK |
右键 |
WM_RBUTTONDOWN |
WM_RBUTTONUP |
WM_RBUTTONDBLCLK |
窗口过程只对三键鼠标接收MBUTTON消息,只对双键鼠标接收RBUTTON消息。而只有当窗口类被定义成接收鼠标双击时,窗口过程才接收DBLCLK(双击)消息。
对所有这些消息来说,参数IParam包含了鼠标的位置信息,其中低位字表示x坐标, 高位字表示y坐标,它们都是相对于窗口客户区左上角的相对坐标。利用LOWORD宏和 HIWORD宏,可以获取这些坐标值:
X = LOWORD (IParam);
y = HIWORD (IParam);
参数wParam表示鼠标按钮、Shift键和Ctrl键的状态。可以利用WINUSER.H头文件中定义的位掩码来测试参数wParam。前缀MK代表“鼠标键”(mouse key)。
MK_LBUTTON 按下左键
MK_MBUTTON 按下中键
MK_RBUTTON 按下右键
MK_SHIFT 按下 Shift 键
MK_CONTROL 按下 Ctrl 键
例如,当接收到WM_LBUTTONDOWN消息时,若wparam & MK_SHIFT 的值为TRUE(非零),则表示按下鼠标左键的同时按下了 Shift键。
●处理Shift键
处理过程依赖Shift和Ctrl键的逻辑处理 |
单键鼠标模拟双键鼠标 |
if (wParam & MK_SHIFT) //按下Shift { if (wParam & MK_CONTROL) { [按下Shift + Ctrl键]; } else{ [只按下Shift键]; } }else{ //未按Shift if (wParam & MK_CONTROL) { [只按下Ctrl键]; }else{ [Shift和Ctrl都没被按下]; } } |
case WM_LBUTTONDOWN: //未按Shift时,直接处理左键 if (!(wParam & MK_SHIFT)) |