滑鼠鍵包括左鍵、右鍵和中鍵(滾輪),每個鍵都有三種事件訊息,一是被按下,二是被釋放,三是雙擊。下表列出了滑鼠操作、訊息名稱及處理函式名。
滑鼠操作 訊息名稱 處理函式名
左鍵按下 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的訊息
MFC 華而不實的滑鼠響應事件
前幾天搞了注入dll 的問題,今天偶然想到如何實現控制項響應滑鼠事件,如何滑鼠移動到某控制項上靜態編輯框或者滑鼠顯示提示資訊,經過幾番搜尋,還好全部解決,就上回的 先在maindialogwnd.cpp中宣告乙個物件用過存放滑鼠提示資訊 手動新增 我還是再找找相關資料,竟然被我找到了函式名為wm i...
cocos2d JS 滑鼠響應事件
對於pc和超級本,新增滑鼠事件的的處理,可以加強使用者的體驗,其處理邏輯與觸控事件基本一樣,多了一些滑鼠特有的事件響應 如滾輪事件 onmousescroll cc.eventmanager.addlistener onmouseup function event onmousedown funct...
視窗滑鼠事件的響應 在滑鼠視窗中繪製矩形的程式
這裡主要是訓練怎麼去響應滑鼠響應事件,那怎麼去定義滑鼠響應函式呢?void cvmousecallback int event 滑鼠響應事件的型別如滑鼠右鍵彈起,右鍵按下,cv event lbuttondown,cv event lbuttondown int x,滑鼠響應是所在的位置,這裡x,y...