更新时间:2024-09-10 10:28
WM_LBUTTONDOWN是一个Windows消息,该消息当用户在window客户区域点击鼠标左键的时候发送。如果当前鼠标没有被捕捉,消息发送给鼠标下面的window窗体。否则,消息发送给当前捕捉鼠标消息的方法。
window窗体通过WindowProc函数接收此消息。
wParam
指示是否其它键被按下。此参数可以是以下的值:
MK_CONTROL
键盘CTRL键被按下。
MK_LBUTTON
鼠标左键被按下。
MK_MBUTTON
鼠标中键被按下。
MK_RBUTTON
鼠标右键被按下。
MK_SHIFT
键盘SHIFT键被按下。
MK_XBUTTON1
Windows 2000/XP: The first X button is down.
MK_XBUTTON2
Windows 2000/XP: The second X button is down.lParamlParam
低字节表示光标的X坐标,坐标是相对于客户区域的左上角。高字节表示光标的Y坐标,坐标是相对于客户区域的左上角。返回值
如果程序处理了这个消息,返回0。
使用以下代码获取光标的坐标:
1.xPos = GET_X_LPARAM(lParam);
2.yPos = GET_Y_LPARAM(lParam);
以上代码需要使用ATL库,定义在windowsx.h中您也可以使用MAKEPOINTS宏转换lParam参数到POINTS结构。
请注意,如下方法:
1.xPos = LOWORD(lParam);
2.yPos = HIWORD(lParam);
即使用LOWORD和HIWORD来获取坐标是不合适的,参考MSDN中对GetMessagePos函数的一段说明:Important Do not use the LOWORD or HIWORD macros to extract the x- and y- coordinates of the cursor position because these macros return incorrect results on systems with multiple monitors. Systems with multiple monitors can have negative x- and y- coordinates, and LOWORD and HIWORD treat the coordinates as unsigned quantities.简要翻译:不要使用LOWORD或HIWORD宏来获取鼠标位置,因为这两个宏在多显示器的系统中返回不正确的值。在多显示器的系统中可能会有负值的x和y轴的坐标,但LOWORD和HIWORD将坐标视为非负数。追根溯源,通过这几个宏的定义我们能够更好地理解这个问题:
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))#define HIWORD(l) ((WORD)((((DWORD_PTR)(l))> >16) & 0xffff))#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) 由上面的代码可以很明显的看出,HIWORD和LOWORD得到的东西会产生丢失负值的问题,而GET_X_LPARAM和GET_Y_LPARAM重新经过类型转换,保证了精度,要检测ATL键是否被按下Windows Message的缩写,请使用GetKeyState(VK_MENU)<0,注意,不能使用GetAsyncKeyState。
WM_LBUTTONDOWN
WPARAM wParam
LPARAM lParam;