您好,登錄后才能下訂單哦!
這篇文章主要講解了“MFC模擬實現自定義消息發送的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MFC模擬實現自定義消息發送的方法”吧!
在MFC框架下,有很多系統已經定義好的消息,例如ON_WM_LBUTTONDOWN()、ON_WM_MBUTTONDOWN()等等。我們在使用的時候只需要聲明并調用就可以了,最簡單的用法。
提升了一點難度的用法就是自己設置自定義消息,再提升一點難度的就是如何模擬系統消息了,一般情況下只是做普通的項目開發功能是用不到的。
在有些時候系統定義的消息不能完全滿足程序的應用,這時候就需要進行消息自定義了,那么該如何實現自定義消息呢?
在MFC框架下,分配了WM_USER之后的消息都是開發人員可以自定義的消息ID。
假設,定義一個選中觸發消息:
#define WM_USER_CLICKED WM_USER+1
這種寫法就代表了定義了一個自定義消息,消息名稱叫做:WM_USER_CLICKED,消息ID號是:WM_USER+1
在這里,溫馨提示一句:在做大型的繪圖開發程序當中,為了方便管理自定義消息,一般都不會直接使用WM_USER進行編號自增,而是使用自定義宏代替WM_USER,為了后續方便管理,格式如下:
#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
如果要是你的程序中只存在了一兩個自定義消息,就沒有必要寫成上面的格式了。
這種格式的好處:
可以根據功能劃分自定義消息區域。假設你目前正在開發一個僅供公司內部使用的基礎框架類,在自定義消息的時候,需要區分哪些是自己開發使用的,哪些是對外開發者調用的。分工明確,不容易消息錯亂。
想要在哪里觸發自定義消息,就需要在哪里發送消息。
在MFC框架中,有兩種發送消息機制:SendMessage、PostMessage。
::SendMessage(GetParent()->GetSafeHwnd() , WM_USER_CLICKED ,參數2 , 參數1);
只是舉例子說明,具體的根據實際功能來確定~
ON_MESSAGE(WM_USER_CLICKED1, OnCustomClicked1)
參數一:定義的自定義消息
參數二:實際窗口中響應的映射消息
afx_msg LRESULT OnCustomClicked1(WPARAM wParam , LPARAM lParam);
具體的操作應用可以在OnCustomClicked1中編寫了,這要根據實際的需求應用了,這里不再做過多的說明,到這里,應該都知道該如何應用了吧~
簡單的自定義消息方法已經在自定義消息中講述了,下面來一個更深層次的提高吧!如何模擬系統消息,為了通俗易懂的講解,這里我們模擬ComboBox控件CBN_SELCHANGE消息。
使用過MFC框架下控件開發的人都知道,該消息是由系統發送的,平時我們只是應用下就可以了,要是讓自己寫一個這樣的觸發消息,該如何實現呢?
前提條件:繼承CWnd類模擬ComboBox控件,這時候,所有的控件消息都需要自己內部模擬,那么,想要讓外部開發人員調用起來與系統的ComboBox中的消息一致,該怎么實現呢?
假設我們應用SendMessage進行消息發送,此時也是需要發送消息,但是需要發送命令消息:WM_COMMAND
WM_COMMAND在什么時候被觸發呢?
1:當用戶從菜單中選擇命令項時
2:當控件向其父窗口發送消息時
3:當加速鍵擊被翻譯時
其實,在WINDOW9X以上都是在發送WM_NOTIFY,但是為了做成兼容基類,所以,依舊采用的是WM_COMMAND消息。
一旦指定了使用WM_COMMAND來進行消息發送,這時候wParam以及lParam該發送什么數據呢?
在發送自定義消息中,wParam參數是分成了高字節與低字節之分的,需要采用MAKEWPARAM宏進行發送。
該宏創建了一個32位的無符號值,用作消息中的wParam參數,該宏連接兩個指定的16位值。
在傳遞參數時,高位是當前模擬發送的ID號,每個窗口甚至是每個控件都有屬于自己的編號,不難獲取到。
低位是需要觸發的系統消息,前面說到了模擬的是CBN_SELCHANGE消息,所以wParam參數的寫法,如下:
MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE)
對于這個參數,就當對來說簡單了,只需要傳遞當前窗口的HWND,轉換成LPARAM參數就可以了。
整體的模擬系統發送格式:
::SendMessage(pwnd->GetSafeHwnd(), WM_COMMAND, MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE), (LPARAM)GetSafeHwnd());
對于模擬系統發送消息來說,最重要的就是SendMessage的第二個參數以及第三個參數了。同樣的道理,也可以使用PostMessage的方式發送。
消息發送出去之后,在外界的使用方式是如何呢?
既然我們模擬的是系統消息,在外部窗口調用的地方與MFC自帶的控件消息方法是一致的
消息映射:
ON_CBN_SELCHANGE(ID_CUSTOMCOMBOBOXID, &CTestComboboxDlg::OnCbnSelchangeComboSd)
感謝各位的閱讀,以上就是“MFC模擬實現自定義消息發送的方法”的內容了,經過本文的學習后,相信大家對MFC模擬實現自定義消息發送的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。