WM_LBUTTONDOWN是一个Windows消息,该消息当用户在window客户区域点击鼠标左键的时候发送。如果当前鼠标没有被捕捉,消息发送给鼠标下面的window
窗体。否则,消息发送给当前捕捉鼠标消息的方法。
Windows 2000/XP: The first X button is down.
低
字节表示光标的X坐标,坐标是相对于客户区域的左上角。高字节表示光标的Y坐标,坐标是相对于客户区域的左上角。返回值
即使用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将坐标视为非负数。追根溯源,通过这几个宏的定义我们能够更好地理解这个问题:
#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。