回應滑鼠點選
如果使用者在游標位於視窗的工作區上方時按下滑鼠按鈕,則視窗會收到下列其中一則訊息。
訊息 | 意義 |
---|---|
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 位。 其中 Windows 檔提及 lParam 的「低序字」和「高階字」,則 64 位大小寫表示低階及低階字組的低階字組。 巨集會擷取正確的值,因此如果您使用它們,您將安全無虞。
滑鼠座標會以像素為單位提供,而不是裝置無關的圖元(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_XBUTTONDOWN和WM_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_LBUTTONDBLCLK訊息。 對等訊息是針對右、中間和 XBUTTON 按鈕所定義。
在您收到按兩下訊息之前,無法判斷第一次按兩下滑鼠是按兩下的開頭。 因此,按兩下動作應該繼續以第一個滑鼠按一下開頭的動作。 例如,在 Windows Shell 中,按兩下即可選取資料夾,而按兩下會開啟資料夾。
非用戶端滑鼠訊息
針對視窗非工作區內發生的滑鼠事件,定義了一組個別的訊息。 這些訊息的名稱中有字母 「NC」。 例如,WM_NCLBUTTONDOWN是非用戶端對等的 WM_LBUTTONDOWN。 一般應用程式不會攔截這些訊息,因為 DefWindowProc 函式會正確處理這些訊息。 不過,它們對於某些進階函式很有用。 例如,您可以使用這些訊息在標題欄中實作自定義行為。 如果您確實處理這些訊息,您通常會在之後將其傳遞至 DefWindowProc 。 否則,您的應用程式會中斷標準功能,例如拖曳或最小化視窗。
下一步