鼠標(biāo)鍵包括左鍵、右鍵和中鍵(滾輪),每個(gè)鍵都有三種事件消息,一是被按下,二是被釋放,三是雙擊。下表列出了鼠標(biāo)操作、消息名稱及處理函數(shù)名。
鼠標(biāo)操作 消息名稱 處理函數(shù)名
左鍵按下 WM_LBUTTONDOWN OnLButtonDown
左鍵釋放 WM_LBUTTONUP OnLButtonUp
左鍵雙擊 WM_LBUTTONDBCLK OnLButtonDbClk
右鍵按下 WM_RBUTTONDOWN OnRButtonDown
右鍵釋放 WM_RBUTTONUP OnRButtonUp
右鍵雙擊 WM_RBUTTONDBCLK OnRButtonDbClk
鼠標(biāo)移動(dòng) WM_MOUSEMOVE OnMouseMove
滾輪移動(dòng) WM_MOUSEWHEEL OnMouseWheel
下面說(shuō)一下幾個(gè)消息響應(yīng)函數(shù)的原型(MFC下的)
按鍵按下和釋放以及鼠標(biāo)移動(dòng)的原型是一樣的,參數(shù)的意義也都一樣,以左鍵按下為例。
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
nFlags表示鼠標(biāo)、Shift鍵和Ctrl鍵的狀態(tài)組合,可以有如下情況:
標(biāo)識(shí)符 功能描述
MK_CONTROL Ctrl鍵被按下
MK_LBUTTON 鼠標(biāo)左鍵被按下
MK_MBUTTON 鼠標(biāo)中鍵被按下
MK_RBUTTON 鼠標(biāo)右鍵被按下
MK_SHIFT Shift鍵被按下
當(dāng)鍵被按下時(shí),對(duì)應(yīng)的標(biāo)識(shí)符的值就為真。例如,在左鍵按下的響應(yīng)中,如果Ctrl鍵同時(shí)被按下了,那么MK_CONTROL值為真,這樣可以通過(guò)與操作及或操作來(lái)定義任意的按鍵組合。
point包含了無(wú)懈可擊當(dāng)前位置相對(duì)于屏幕左上角的X和Y坐標(biāo)值。
滾輪的響應(yīng)函數(shù)與上面的響應(yīng)函數(shù)略有不同。
afx_msg void OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
nFlags和pt參數(shù)的含義同前面的nFlags和point,只說(shuō)一下zDelta。
zDelta表示滾輪滾動(dòng)的距離,是WHEEL_DELTA(被設(shè)定為120)的倍數(shù),正數(shù)時(shí),表示滾輪向前運(yùn)動(dòng)(離開用戶的方向,我們通常說(shuō)的向上),負(fù)數(shù)時(shí)則相反。
這個(gè)WHEEL_DELTA是動(dòng)作能否被響應(yīng)的一個(gè)閾值。滾輪每滾過(guò)一個(gè)這樣的距離才能響應(yīng)一次。之所以設(shè)定WHEEL_DELTA,是為適應(yīng)將來(lái)可能出現(xiàn)的高分辨率的甚至是可以自由滾動(dòng)的滾輪而設(shè)計(jì)的。
再說(shuō)一下關(guān)于鼠標(biāo)的捕獲
在上面的介紹中,我們提到了鼠標(biāo)的按下和釋放。如果我們?cè)诔绦虻拇翱趨^(qū)按下鼠標(biāo),移出窗口后再釋放鼠標(biāo),這時(shí)這個(gè)釋放鼠標(biāo)的操作就會(huì)丟失。就是說(shuō),如果沒(méi)有采用鼠標(biāo)捕獲的話,當(dāng)鼠標(biāo)在你的客戶區(qū)內(nèi)的時(shí)候,你可以得到鼠標(biāo)的消息,當(dāng)它移出你的客戶之后,你就得到到鼠標(biāo)的消息了。為防止這種情況的發(fā)生,可以采用鼠標(biāo)捕獲的技術(shù)。
在鼠標(biāo)開始使用時(shí)用SetCapture函數(shù)捕獲鼠標(biāo),當(dāng)鼠標(biāo)退出是用ReleaseCapture函數(shù)釋放捕獲。通常會(huì)在OnLButtonDown里捕獲鼠標(biāo),在OnLButtonUp里釋放捕獲。
使用鼠標(biāo)捕獲時(shí)還必須注意的一點(diǎn)是系統(tǒng)中只能有一個(gè)程序調(diào)用SetCapture,在不使用時(shí)必須調(diào)用ReleaseCapture釋放。而GetCapture可以知道當(dāng)前哪個(gè)窗口調(diào)用了SetCapture。
void SetCapture();
void ReleaseCapture();
調(diào)用ReleaseCapture時(shí)會(huì)產(chǎn)生一個(gè)WM_CAPTURECHANGED的消息