Windows桌面应用程序(1-2-5-2nd) 响应鼠标点击

如果用户在光标位于窗口的客户区域上时单击鼠标按钮,窗口将收到以下消息之一。

信息 含义
WM_LBUTTONDOWN 左键按下
WM_LBUTTONUP 左键松开
WM_MBUTTONDOWN 中间按钮按下
WM_MBUTTONUP 中间按钮松开
WM_RBUTTONDOWN 右键按下
WM_RBUTTONUP 右键松开
WM_XBUTTONDOWN XBUTTON1或XBUTTON2按下
WM_XBUTTONUP XBUTTON1或XBUTTON2松开

回想一下,客户区是排除帧的窗口的一部分。有关客户区的更多信息,请参阅什么是窗口?
鼠标坐标
在所有这些消息中,lParam参数都包含鼠标指针的x坐标和y坐标。lParam的最低16位包含x坐标,接下来的16位包含y坐标。使用GET_X_LPARAM和GET_Y_LPARAM宏从lParam解开坐标。

int xPos=GET_X_LPARAM(lParam);
int yPos=GET_Y_LPARAM(lParam);

这些宏在头文件WindowsX.h中定义。
在64位Windows上,lParam是64位值。lParam的高32位不被使用。MSDN文档提到lParam的“低位字”和“高位字”。在64位的情况下,这意味着低32位的低位和高位字。宏提取正确的值,所以如果你使用它们,你将是安全的。
鼠标坐标是以像素为单位给出的,而不是与设备无关的像素(DIP),并且是相对于窗口的客户区域进行测量的。坐标是有符号的值。客户区域左上方的位置具有负坐标,如果您在窗口外面追踪鼠标位置,这很重要。我们将在后面的话题中看到如何做到这一点,捕捉窗外的鼠标移动
额外的标志
wParam参数包含标志的按位OR,指示其他鼠标按钮加SHIFT和CTRL键的状态。

标志 含义
MK_CONTROL CTRL键按下。
MK_LBUTTON 鼠标左键按下。
MK_MBUTTON 鼠标中键按下。
MK_RBUTTON 鼠标右键按下。
MK_SHIFT SHIFT键已按下。
MK_XBUTTON1 XBUTTON1按钮已按下。
MK_XBUTTON2 XBUTTON2按钮按下。

没有标志意味着没有按下相应的按钮或按键。例如要测试CTRL键是否按下:

if(wParam&MK_CONTROL){
    //...
}

如果您需要查找除CTRL和SHIFT以外的其他键的状态,请使用键盘输入中所述的GetKeyState功能。
WM_XBUTTONDOWNWM_XBUTTONUP窗口消息适用于XBUTTON1和XBUTTON2。wParam参数指示哪个按钮被点击。

UINT button=GET_XBUTTON_WPARAM(wParam);
if(button==XBUTTON1){
    // XBUTTON1 was clicked.
}
else if(button==XBUTTON2){
    // XBUTTON2 was clicked.
}

双击
窗口默认情况下不会收到双击通知。要获得双击,请在注册窗口类时在WNDCLASS结构中设置CS_DBLCLKS标志。

WNDCLASS wc={};
wc.style=CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);

如果您如图所示设置CS_DBLCLKS标志,则窗口将接收到双击通知。双击是通过名称中带有“DBLCLK”的窗口消息指示的。例如,双击鼠标左键生成以下消息序列:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
实际上,通常会生成的第二个WM_LBUTTONDOWN消息将成为WM_LBUTTONDBLCLK消息。等价消息是为右,中和XBUTTON按钮定义的。
在获得双击消息之前,没有办法知道第一次单击鼠标是双击的开始。因此,双击操作应该继续以第一次鼠标点击开始的操作。例如,在Windows Shell中,单击一次即可选择一个文件夹,而双击则打开该文件夹。
非客户端鼠标消息
为窗口的非客户区域内发生的鼠标事件定义了一组单独的消息。这些消息的名称中包含字母“NC”。例如,WM_NCLBUTTONDOWNWM_LBUTTONDOWN的非客户端等效项。一个典型的应用程序不会拦截这些消息,因为DefWindowProc函数正确处理这些消息。但是,它们可以用于某些高级功能。例如,您可以使用这些消息在标题栏中实现自定义行为。如果你处理这些消息,你通常应该把它们传递给DefWindowProc。否则,您的应用程序将会破坏标准功能,如拖动或最小化窗口。
下一个
鼠标移动


原文链接:Responding to Mouse Clicks

猜你喜欢

转载自blog.csdn.net/qq_37422196/article/details/79234305