鼠標

鼠標函數:

LoadCursor(NULL,IDC_ARROW)

SetCursor(hCursor)

ShowCursor(bShow)

GetCursorPos(&pt):獲得座標是屏幕座標。

SetCursorPos(x, y):(x, y)是屏幕座標值。

GetSystemMetrics(SM_MOUSEPRESENT):鼠標可用返回TRUE,不可用返回FALSE,但Windows 98總返回TRUE。

GetSystemMetrics(SM_CMOUSEBUTTONS):返回鼠標的鍵數。鼠標不可用返回0(Windows 98返回2)。

GetSystemMetrics(SM_SWAPBUTTON):鼠標是否是左手習慣。一般來說程序不需要知道這個,因爲操作系統屏蔽了這些,即使左手習慣點了右鍵,也產生的是左鍵的消息。但是在一些程序中如果要監控物理鼠標點擊的是左鍵還是右鍵就要用到這個函數。鼠標的一些其他參數,如雙擊速度,可以從控制面板設置,也可以用SystemParametersInfo函數獲取和設置

 

客戶區鼠標消息:

Windows定義了21條鼠標消息,但有11條與客戶區(Client Area)無關,一般程序會忽略它們。十條常用消息:WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_MBUTTONDOWN、WM_MBUTTONUP、WM_MBUTTONDBLCLK、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_RBUTTONDBLCLK。

對所有這些消息,lParam包含了鼠標的位置,低字是X座標值,高字是Y座標值。wParam表示鼠標鍵和Ctrl、Shift鍵的狀態,位測試的宏定義有:MK_LBUTTON、MK_MBUTTON、MK_RBUTTON、MK_SHIFT、MK_CONTROL。比如,如果wParam & MK_SHIFT爲真,收到鼠標消息時Shift鍵已經按下。不能在處理消息時用GetKeyState(VK_SHIFT)來獲取Shift鍵的狀態,因爲GetKeyState獲得的是消息處理時的按鍵狀態而不是產生消息時的按鍵狀態。

Windows並不會對鼠標移動任意一個像素點都產生WM_MOUSEMOVE消息,程序收到WM_MOUSEMOVE的數量取決於鼠標硬件和WM_MOUSEMOVE消息處理程序的處理速度。

如果用鼠標左鍵點擊非活動(active)窗口,Windows會把該窗口變爲活動的並傳送WM_LBUTTONDOWN消息。但當前顯示了模式對話框,系統不會把鼠標消息發給其他窗口。

如果窗口過程中要處理雙擊消息,必須在註冊窗口時的窗口風格(style)中設置CS_DBLCLKS,如wndclass.style=CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS。如果註冊窗口類型沒有CS_DBLCLKS,雙擊產生的消息序列是:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDOWN、WM_LBUTTONUP。如果接收雙擊消息,產生的消息序列是:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_LBUTTONDBLCLK、WM_LBUTTONUP。因而如果雙擊只是在單擊的基礎上附加操作會很容易,但如果雙擊的第一個WM_LBUTTONDOWN消息與單擊處理行爲不一樣,那程序就很複雜了。

 

非客戶區鼠標消息:

如果鼠標在客戶區之外窗口之內點擊或移動,就會產生非客戶區(nonclient-area)消息。這些消息以NC爲標誌,如WM_NCMOUSEMOVE、WM_NCRBUTTONUP等。

非客戶區消息的wParam與lParam參數的意義與客戶區消息不同。wParam表示鼠標在非客戶區的什麼區域移動或點擊,WINUSER.H中定義了測試宏,以HT(hit-test)開頭。lParam也是鼠標的座標,但用的是屏幕座標表示。我們可以用ScreenToClient(hwnd, &pt)和ClientToScreen(hwnd, &pt)轉換屏幕座標和客戶區座標。

 

Hit-Test消息:

鼠標消息的最後一個消息——WM_NCHITTEST。它產生在所有客戶區和非客戶區鼠標消息之前,並轉成客戶區或非客戶區消息。lParam參數是鼠標的屏幕座標,wParam參數無用。Windows應用程序一般把它交由DefWindowProc處理,DefWindowProc根據座標返回Hit-Test值,這些值可以是非客戶區消息的wParam值,也可以是以下四個:HTCLIENT、HTNOWHERE、HTTRANSPARENT、HTERROR。如果返回的是是非客戶區的值,系統再產生一個非客戶區消息;如果返回HTCLIENT,則產生一個客戶區消息。如果要捕獲所有的鼠標消息,可以在自己的消息處理函數中這樣處理:

 

以上代碼可以屏蔽所有鼠標消息。

 

捕獲鼠標:

鼠標不在窗口區域時,不會給窗口發送鼠標消息,但有時需要用到這些消息,我們只需要調用SetCapture(hwnd)。之後鼠標消息將都會以客戶區消息發送給hwnd窗口,所有消息的lParam都是客戶區座標,即使鼠標在非客戶區。取消捕獲鼠標時,調用ReleaseCapture()。對於32位Windows系統,SetCapture還有些問題——如果設置了捕獲鼠標,鼠標鍵沒按下移動到別的窗口,那麼收到鼠標消息的就是鼠標下的窗口而不是設置的捕獲窗口,因而會造成一些混亂。爲解決這個問題,我們不能一直設置捕獲鼠標,只在按下鼠標鍵時捕獲,釋放鼠標鍵時取消。

 

鼠標滾輪:

滾輪點擊與中鍵點擊效果一樣,產生中鍵消息。當滾輪滾動時,焦點窗口(不是鼠標下窗口)產生WM_MOUSEWHEEL消息。該消息lParam是鼠標的屏幕座標,wParam也是一些標誌位,表示鼠標鍵和Shift、Ctrl鍵的狀態。它還有一個新的信息,是wParam的高字,叫做delta值,現在一般是120或-120,分別表示文檔向上或向下移動三行。一個Delta移動多少行可以從用SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,  &ulScollLines, 0)獲得(當然可以不用理)。

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章