[VC] 滑鼠事件的響應

肥勒個翔發表於2013-11-26
滑鼠鍵包括左鍵、右鍵和中鍵(滾輪),每個鍵都有三種事件訊息,一是被按下,二是被釋放,三是雙擊。下表列出了滑鼠操作、訊息名稱及處理函式名。
 滑鼠操作 訊息名稱  處理函式名 
 左鍵按下  WM_LBUTTONDOWN  OnLButtonDown
 左鍵釋放  WM_LBUTTONUP  OnLButtonUp
 左鍵雙擊  WM_LBUTTONDBCLK  OnLButtonDbClk
 右鍵按下  WM_RBUTTONDOWN  OnRButtonDown
 右鍵釋放  WM_RBUTTONUP  OnRButtonUp
 右鍵雙擊  WM_RBUTTONDBCLK  OnRButtonDbClk
 滑鼠移動  WM_MOUSEMOVE  OnMouseMove
 滾輪移動  WM_MOUSEWHEEL  OnMouseWheel
下面說一下幾個訊息響應函式的原型(MFC下的)
按鍵按下和釋放以及滑鼠移動的原型是一樣的,引數的意義也都一樣,以左鍵按下為例。
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
nFlags表示滑鼠、Shift鍵和Ctrl鍵的狀態組合,可以有如下情況:
 識別符號  功能描述
 MK_CONTROL  Ctrl鍵被按下
 MK_LBUTTON  滑鼠左鍵被按下
 MK_MBUTTON  滑鼠中鍵被按下
 MK_RBUTTON  滑鼠右鍵被按下
 MK_SHIFT  Shift鍵被按下
當鍵被按下時,對應的識別符號的值就為真。例如,在左鍵按下的響應中,如果Ctrl鍵同時被按下了,那麼MK_CONTROL值為真,這樣可以通過與操作及或操作來定義任意的按鍵組合。
point包含了無懈可擊當前位置相對於螢幕左上角的X和Y座標值。
滾輪的響應函式與上面的響應函式略有不同。
afx_msg void OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
nFlags和pt引數的含義同前面的nFlags和point,只說一下zDelta。
zDelta表示滾輪滾動的距離,是WHEEL_DELTA(被設定為120)的倍數,正數時,表示滾輪向前運動(離開使用者的方向,我們通常說的向上),負數時則相反。
這個WHEEL_DELTA是動作能否被響應的一個閾值。滾輪每滾過一個這樣的距離才能響應一次。之所以設定WHEEL_DELTA,是為適應將來可能出現的高解析度的甚至是可以自由滾動的滾輪而設計的。
 
再說一下關於滑鼠的捕獲
在上面的介紹中,我們提到了滑鼠的按下和釋放。如果我們在程式的視窗區按下滑鼠,移出視窗後再釋放滑鼠,這時這個釋放滑鼠的操作就會丟失。就是說,如果沒有采用滑鼠捕獲的話,當滑鼠在你的客戶區內的時候,你可以得到滑鼠的訊息,當它移出你的客戶之後,你就得到到滑鼠的訊息了。為防止這種情況的發生,可以採用滑鼠捕獲的技術。
在滑鼠開始使用時用SetCapture函式捕獲滑鼠,當滑鼠退出是用ReleaseCapture函式釋放捕獲。通常會在OnLButtonDown裡捕獲滑鼠,在OnLButtonUp裡釋放捕獲。
使用滑鼠捕獲時還必須注意的一點是系統中只能有一個程式呼叫SetCapture,在不使用時必須呼叫ReleaseCapture釋放。而GetCapture可以知道當前哪個視窗呼叫了SetCapture。
void SetCapture();
void ReleaseCapture();
呼叫ReleaseCapture時會產生一個WM_CAPTURECHANGED的訊息。

相關文章