現實世界中的按鈕的動作為:按下後只要不鬆手就一直處於被按下狀態,此時會執行開關閉合等類似的行為;鬆開手後,按鈕抬起,執行開關斷開等類似行為。vc++中預設的按鈕的外觀行為與物理按鈕類似,也是滑鼠按下後保持被按下狀態,鬆開滑鼠則自動彈起。然而問題是,按鈕只會在按下-抬起這個過程完成後才會向父視窗傳送wm_command訊息,單獨的按下以及單獨的抬起都不會通知父視窗。
在工業控制軟體中,經常需要模擬物理按鈕的行為,按鈕按下和抬起都能夠自動觸發響應的動作。
在windows中,按鈕本質上是一種特殊的視窗,它所使用的視窗類已經被commctl32.dll這個系統檔案註冊了,所以程式中可以直接使用。既然是視窗,那麼就有自己的視窗訊息處理函式,這個函式決定了按鈕的特性(單獨的按下以及單獨的抬起都不會通知父視窗),為了改變其行為,就需要替換掉這個函式。在新函式裡,我們可以把捕獲到的wm_lbuttondown和wm_lbuttonup訊息轉換為自定義的訊息,然後傳送給父視窗。這樣父視窗就可以在按鈕被按下和抬起的時候分別收到對應的訊息了,也就完成了物理按鈕的模仿。
為了替換按鈕的視窗過程,我們可以直接使用win32api中類似setwindowlong()等函式。然而,我們有更好的選擇,那就是mfc把這種改變功能以及其他很多常用功能封裝成了乙個cbutton類。我們只需要重寫virtual bool onwndmsg(uint message, wparam wparam, lparam lparam, lresult* presult);這個虛函式就可以了。
新建乙個mfc 對話方塊應用程式。
(0)在資源檢視,通過工具箱為對話方塊增加乙個普通按鈕控制項。此時,ide為我們做了三件事:在資源檔案(.rc)中增加按鈕描述,在resource.h檔案中對按鈕控制項的id號進行巨集定義。
(0-1)右鍵單擊按鈕控制項,選擇新增變數,在之後出現的嚮導對話方塊中,為這個控制項增加乙個控制項變數m_btn。此時,ide為我們做了兩件事:在主對話方塊類增加乙個cbutton型別的變數 m_btn; 在主對話方塊的dodataexcahge()函式中增加 ddx_control(pdx, id_test, m_btn);
(1)新建乙個類myrealbutton, 繼承自cbutton。
(2)重寫myrealbutton類的onwndmsg()。
bool myrealbutton::onwndmsg(uint message, wparam wparam, lparam lparam, lresult* presult)
return cbutton::onwndmsg(message, wparam, lparam, presult);
}
(3)重寫主對話方塊(按鈕的父視窗)的onmsg()虛函式,捕獲按鈕發出的訊息進行處理。
bool crealbuttondlg::onwndmsg(uint message, wparam wparam, lparam lparam, lresult* presult)
else if(wparam==0) // 按鈕被滑鼠左鍵抬起
break;
default:
break;
} return cdialog::onwndmsg(message, wparam, lparam, presult);
}
(4)把m_btn變數的型別改為myrealbutton。如下所示:
//cbutton m_btn;
myrealbutton m_btn;
這樣,這個按鈕控制項的行為就被我們新建的myrealbutton類控制了。
按鈕按下事件的處理
第一種方法,建立元件物件時儲存了引用,則用getsource方法進行判斷 public void actionperformed actionevent evt else jbutton mybutton new jbutton ok 第二種方法,不儲存物件的引用,而是用setactioncomma...
C WinFrom捕獲按鍵按下事件(二)
先吐槽一下,csdn的文章儲存貌似有點兒問題,字數太多了儲存不了,害我連截圖都丟了。二 keyup事件 當使用者釋放了按下的按鍵後,就會觸發keyup事件,keyup事件與keydown事件的介面一致,其原型如下 private void tbip1 keyup object sender,keye...
VC中實現按鈕提示
virtual bool create cwnd pparentwnd,dword dwstyle 0 pparentwnd是父視窗指標,通常用this就行了。dwstyle是樣式,一般用預設值,即空著這個引數就可以了。bool addtool cwnd pwnd,uint nidtext,lpcr...