一、檢測滑鼠:
判斷是否有滑鼠: GetSystemMetrics(SM_MOUSEPRESENT);//WINDOWS98後有效
判斷滑鼠幾個鍵:GetSystemMetrics(SM_CMOUSEBUTTONS);//WINDOWS98後有效
二、滑鼠訊息,總共21個:
客戶區訊息
#define WM_MOUSEMOVE 0x0200
#define WM_LBUTTONDOWN 0x0201
#define WM_LBUTTONUP 0x0202
#define WM_LBUTTONDBLCLK 0x0203
#define WM_RBUTTONDOWN 0x0204
#define WM_RBUTTONUP 0x0205
#define WM_RBUTTONDBLCLK 0x0206
#define WM_MBUTTONDOWN 0x0207
#define WM_MBUTTONUP 0x0208
#define WM_MBUTTONDBLCLK 0x0209
非客戶去訊息
#define WM_NCMOUSEMOVE 0x00A0
#define WM_NCLBUTTONDOWN 0x00A1
#define WM_NCLBUTTONUP 0x00A2
#define WM_NCLBUTTONDBLCLK 0x00A3
#define WM_NCRBUTTONDOWN 0x00A4
#define WM_NCRBUTTONUP 0x00A5
#define WM_NCRBUTTONDBLCLK 0x00A6
#define WM_NCMBUTTONDOWN 0x00A7
#define WM_NCMBUTTONUP 0x00A8
#define WM_NCMBUTTONDBLCLK 0x00A9
#define WM_NCHITTEST 0x0084
lParam 表示滑鼠位置,高位y,低位x。對客戶區訊息來講,是客戶區座標,對非客戶區訊息來說,是螢幕座標。
wParam 對客戶區訊息來說,表示滑鼠鍵及SHIFT和CTRL狀態。
判斷如下:
wParam & MK_LBUTTON
wParam & MK_RBUTTON
wParam & MK_MBUTTON
wParam & MK_SHIFT
wParam & MK_CONTROL
這些在處理MOUSEMOVE的時候比較有用,比如在移動中判斷是否按下按鈕,在移動中是否按著SHIFT或CTRL。
對非客戶區訊息來說,表示移動或者單擊的非客戶區位置。
三、滑鼠訊息的處理過程。
關鍵:WM_NCHITTEST,點擊測試訊息。
此訊息優於其他一切客戶訊息和非客戶滑鼠訊息。 lParam代表x,y螢幕座標。wParam沒用。
window應用程式把這個訊息發送給DefWindowProc,然後產生基於滑鼠位置的所有其他滑鼠訊息。
對非客戶訊息,DefWindowProc的傳回值作為wParam的參數,這個值可以是任何非客戶區訊息加上以下內容:
HTCLIENT 客戶區 //如果是這個,會將螢幕座標轉化為客戶區左邊,然後產生客戶區訊息。
HTNOWHERE 不在視窗中
HTTRANSPARENT 視窗由另一個視窗覆蓋
HRERROR 使DefWindowProc發出轟鳴聲。
舉例:禁止視窗滑鼠事件:
case WM_NCHITTEST:
return (LRESULT)HTNOWHERE;
四、游標函數:
LoadCursor
SetCursor
ShowCursor
GetCursorPos
五,如果一個自訂視窗在定義的時候,不包含CS_DBLCLKS,那視窗不會接收到雙擊事件,只能是兩個單擊。
六、捕獲和釋放滑鼠。
SetCapture(hwnd);
ReleaseCapture();
捕獲滑鼠後,不管滑鼠在什麼地方產生訊息,訊息都會以客戶區訊息的方式傳送給hwnd視窗。
七、滾動輪。
滾動輪產生訊息:WM_MOUSEWHEEL
wParam 表明滑鼠鍵及SHIFT\CTRL是否被按下
wParam的高位表示轉動的方向,正為前,負為後,等於120或-120。40為一行,所以滾動一下前進或後退3行。
lParam 擷取滑鼠的位置,是相對於螢幕左上方的,而不是客戶區的。