WM-LBUTTONDOWN NOTIFICATION
簡介
WM_LBUTTONDOWN訊息當用戶在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_LBUTTONDOWNWPARAM wParam
LPARAM lParam;