MFC模擬實(shí)現(xiàn)自定義消息發(fā)送
在MFC框架下,有很多系統(tǒng)已經(jīng)定義好的消息,例如ON_WM_LBUTTONDOWN()、ON_WM_MBUTTONDOWN()等等。我們在使用的時(shí)候只需要聲明并調(diào)用就可以了,最簡單的用法。
提升了一點(diǎn)難度的用法就是自己設(shè)置自定義消息,再提升一點(diǎn)難度的就是如何模擬系統(tǒng)消息了,一般情況下只是做普通的項(xiàng)目開發(fā)功能是用不到的。
在這里,我首先講解下如何實(shí)現(xiàn)自定義消息,再深層次的講述如何模擬系統(tǒng)消息,有需要的可以了解下喲~
自定義消息
在有些時(shí)候系統(tǒng)定義的消息不能完全滿足程序的應(yīng)用,這時(shí)候就需要進(jìn)行消息自定義了,那么該如何實(shí)現(xiàn)自定義消息呢?
第一步:定義自定義消息名稱以及ID
在MFC框架下,分配了WM_USER之后的消息都是開發(fā)人員可以自定義的消息ID。
假設(shè),定義一個(gè)選中觸發(fā)消息:
#define WM_USER_CLICKED WM_USER+1
這種寫法就代表了定義了一個(gè)自定義消息,消息名稱叫做:WM_USER_CLICKED,消息ID號是:WM_USER+1
在這里,溫馨提示一句:在做大型的繪圖開發(fā)程序當(dāng)中,為了方便管理自定義消息,一般都不會直接使用WM_USER進(jìn)行編號自增,而是使用自定義宏代替WM_USER,為了后續(xù)方便管理,格式如下:
#define UIXML_WM_BASE WM_USER + 20000 #define WM_USER_CLICKED1 UIXML_WM_BASE +0 #define WM_USER_CLICKED2 UIXML_WM_BASE+1 #define WM_USER_CLICKED3 UIXML_WM_BASE+2 #define WM_USER_CLICKED4 UIXML_WM_BASE+3
如果要是你的程序中只存在了一兩個(gè)自定義消息,就沒有必要寫成上面的格式了。
這種格式的好處:
可以根據(jù)功能劃分自定義消息區(qū)域。假設(shè)你目前正在開發(fā)一個(gè)僅供公司內(nèi)部使用的基礎(chǔ)框架類,在自定義消息的時(shí)候,需要區(qū)分哪些是自己開發(fā)使用的,哪些是對外開發(fā)者調(diào)用的。分工明確,不容易消息錯(cuò)亂。
第二步:發(fā)送自定義消息
想要在哪里觸發(fā)自定義消息,就需要在哪里發(fā)送消息。
在MFC框架中,有兩種發(fā)送消息機(jī)制:SendMessage、PostMessage。
::SendMessage(GetParent()->GetSafeHwnd() , WM_USER_CLICKED ,參數(shù)2 , 參數(shù)1);
只是舉例子說明,具體的根據(jù)實(shí)際功能來確定~
第三步:自定義消息映射
ON_MESSAGE(WM_USER_CLICKED1, OnCustomClicked1)
參數(shù)一:定義的自定義消息
參數(shù)二:實(shí)際窗口中響應(yīng)的映射消息
第四步:自定義消息實(shí)現(xiàn)
afx_msg LRESULT OnCustomClicked1(WPARAM wParam , LPARAM lParam);
具體的操作應(yīng)用可以在OnCustomClicked1中編寫了,這要根據(jù)實(shí)際的需求應(yīng)用了,這里不再做過多的說明,到這里,應(yīng)該都知道該如何應(yīng)用了吧~
模擬系統(tǒng)消息
簡單的自定義消息方法已經(jīng)在自定義消息中講述了,下面來一個(gè)更深層次的提高吧!如何模擬系統(tǒng)消息,為了通俗易懂的講解,這里我們模擬ComboBox控件CBN_SELCHANGE消息。
使用過MFC框架下控件開發(fā)的人都知道,該消息是由系統(tǒng)發(fā)送的,平時(shí)我們只是應(yīng)用下就可以了,要是讓自己寫一個(gè)這樣的觸發(fā)消息,該如何實(shí)現(xiàn)呢?
前提條件:繼承CWnd類模擬ComboBox控件,這時(shí)候,所有的控件消息都需要自己內(nèi)部模擬,那么,想要讓外部開發(fā)人員調(diào)用起來與系統(tǒng)的ComboBox中的消息一致,該怎么實(shí)現(xiàn)呢?
假設(shè)我們應(yīng)用SendMessage進(jìn)行消息發(fā)送,此時(shí)也是需要發(fā)送消息,但是需要發(fā)送命令消息:WM_COMMAND
WM_COMMAND在什么時(shí)候被觸發(fā)呢?
1:當(dāng)用戶從菜單中選擇命令項(xiàng)時(shí)
2:當(dāng)控件向其父窗口發(fā)送消息時(shí)
3:當(dāng)加速鍵擊被翻譯時(shí)
其實(shí),在WINDOW9X以上都是在發(fā)送WM_NOTIFY,但是為了做成兼容基類,所以,依舊采用的是WM_COMMAND消息。
一旦指定了使用WM_COMMAND來進(jìn)行消息發(fā)送,這時(shí)候wParam以及l(fā)Param該發(fā)送什么數(shù)據(jù)呢?
wParam參數(shù)
在發(fā)送自定義消息中,wParam參數(shù)是分成了高字節(jié)與低字節(jié)之分的,需要采用MAKEWPARAM宏進(jìn)行發(fā)送。
該宏創(chuàng)建了一個(gè)32位的無符號值,用作消息中的wParam參數(shù),該宏連接兩個(gè)指定的16位值。
在傳遞參數(shù)時(shí),高位是當(dāng)前模擬發(fā)送的ID號,每個(gè)窗口甚至是每個(gè)控件都有屬于自己的編號,不難獲取到。
低位是需要觸發(fā)的系統(tǒng)消息,前面說到了模擬的是CBN_SELCHANGE消息,所以wParam參數(shù)的寫法,如下:
MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE)
LPARAM參數(shù)
對于這個(gè)參數(shù),就當(dāng)對來說簡單了,只需要傳遞當(dāng)前窗口的HWND,轉(zhuǎn)換成LPARAM參數(shù)就可以了。
整體的模擬系統(tǒng)發(fā)送格式:
::SendMessage(pwnd->GetSafeHwnd(), WM_COMMAND, MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE), (LPARAM)GetSafeHwnd());
對于模擬系統(tǒng)發(fā)送消息來說,最重要的就是SendMessage的第二個(gè)參數(shù)以及第三個(gè)參數(shù)了。同樣的道理,也可以使用PostMessage的方式發(fā)送。
消息發(fā)送出去之后,在外界的使用方式是如何呢?
既然我們模擬的是系統(tǒng)消息,在外部窗口調(diào)用的地方與MFC自帶的控件消息方法是一致的
消息映射:
ON_CBN_SELCHANGE(ID_CUSTOMCOMBOBOXID, &CTestComboboxDlg::OnCbnSelchangeComboSd)
看著這個(gè)方法是不是很熟悉?與自帶的ComboBox方式是不是一模一樣?后續(xù)的使用方式都是一致的啦!
到此這篇關(guān)于MFC模擬實(shí)現(xiàn)自定義消息發(fā)送的文章就介紹到這了,更多相關(guān)MFC自定義消息發(fā)送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼
這篇文章主要介紹了利用C++實(shí)現(xiàn)的放煙花程序,用到了EGE圖形庫,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下2023-01-01C/C++函數(shù)調(diào)用棧的實(shí)現(xiàn)方法
這篇文章主要介紹了C/C++函數(shù)調(diào)用棧的實(shí)現(xiàn)方法,可實(shí)現(xiàn)一個(gè)簡單的腳本解釋器,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10C/C++?QT實(shí)現(xiàn)自定義對話框的示例代碼
對話框分為多種,常見的有通用對話框,自定義對話框,模態(tài)對話框,非模態(tài)對話框等,本文主要介紹了QT自定義對話框,感興趣的可以了解一下2021-11-11C語言如何把浮點(diǎn)數(shù)轉(zhuǎn)換為字符串
這篇文章主要介紹了C語言如何把浮點(diǎn)數(shù)轉(zhuǎn)換為字符串方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Qt實(shí)現(xiàn)圖片移動(dòng)實(shí)例(圖文教程)
這學(xué)期實(shí)訓(xùn)的時(shí)候用MFC做過一個(gè)飛機(jī)大戰(zhàn),很無聊的東西,一直想用Qt做一個(gè);首先需要解決的問題是圖片的移動(dòng),怎么說飛機(jī)啊子彈啊都是動(dòng)著的,圖片當(dāng)然要跑起來,感興趣的你可不要走開啊2013-01-01