在MFC應用程序中傳輸的消息有三種類(lèi)型:窗口消息、命令消息和控件通知。
(1)窗口消息:WM_XXX
窗口消息(Window Message)一般與窗口的內部運作有關(guān),如:創(chuàng )建窗口、繪制窗口和銷(xiāo)毀窗口等。通常,消息是從系統發(fā)送到窗口,或從窗口發(fā)送到窗口。
(2)命令消息:WM_COMMAND
命令消息一般與處理用戶(hù)請求相關(guān),當用戶(hù)單擊一個(gè)菜單項或工具欄時(shí),命令消息產(chǎn)生,并被發(fā)送到能處理該請求的類(lèi)對象(如:裝載文件、編輯文本和保存選項等)。
(3)控件通知:有多種格式 通常,控件通知在某些重要事件發(fā)生時(shí),由控件窗口發(fā)送到父窗口,如打開(kāi)一個(gè)組合框??丶ㄖ獮楦复翱谶M(jìn)一步控制子窗口提供了機會(huì )。例如,打開(kāi)一個(gè)組合框時(shí),父窗口可以用組合框初建時(shí)得不到的消息填充它。
BN_XXXX是CButton產(chǎn)生的消息,EN_XXXX是CEdit產(chǎn)生的消息,等等。
這個(gè)博客寫(xiě)的比較詳細http://blog.csdn.net/zhanglidn013/article/details/6958257
下面這個(gè)通知消息我比較模糊:
Windows自定義的子窗口控件(Predefined Chilld Window Controls)包括BUTTON、COMBOBOX、EDIT、LISTBOX、RichEdit、SCROLLBAR、STATIC。
以上Windows預定義的子窗口控件的窗口過(guò)程中做了反射處理,即在某一事件(點(diǎn)擊菜單,點(diǎn)擊加速鍵,點(diǎn)擊子窗口按鈕,點(diǎn)擊工具欄按鈕)處理后發(fā)送一個(gè)WM_COMMAND通知消息給父窗口。這樣某個(gè)事件發(fā)生了,子窗口做默認處理后,父窗口可以做后續處理使父子窗口工作協(xié)調。例如按下按鈕,按鈕呈凹陷狀,這是由BtnProc對WM_LBUTTONDOWN(WM_PAINT)的重繪處理;松開(kāi)按鈕,按鈕恢復原態(tài),這是由BtnProc對WM_LBUTTONUP(WM_PAINT)的重繪處理。往往在松開(kāi)按鈕的時(shí)候,發(fā)送WM_COMMAND消息(消息碼為BN_CLICKED)給父窗口,由父窗口做點(diǎn)擊事件響應,這樣便于狀態(tài)和邏輯的分離。
還有消息映射 消息反射之分。
①、映射機制的原理 Windows 下的程序包括 Windows 系統都是基于消息機制的。 MFC消息映射機制的具體實(shí)現方法是:在每個(gè)能接收和處理消息的類(lèi)中,定義一個(gè)消息和消息響應函數的靜態(tài)對照表,即消息映射表; 在消息映射表中,消息與對應的消息處理函數指針是成對出現的。某個(gè)類(lèi)能處理的所有消息及其對應的消息處理函數的地址都列在這個(gè)類(lèi)所對應的靜態(tài)表中; 當有消息需要處理時(shí),程序只要搜索該消息靜態(tài)表,查看表中是否含有該消息,就可以知道該類(lèi)能否處理此消息; 如果能處理該消息,則同樣依照靜態(tài)表能很容易找到并調用對應的消息處理函數!
②、一般情況下,一個(gè)MFC的消息映射在程序中有三處相關(guān)信息:1》消息響應函數的聲明 2》消息響應函數實(shí)現 3》用來(lái)關(guān)聯(lián)消息和消息響應函數的宏 具體見(jiàn)示例代碼……更為詳細的講解參見(jiàn)《深入淺出MFC 第二版 簡(jiǎn)體中文版》 - 侯杰:http://www.cctry.com/thread-192-1-1.html
③、針對不同的 Windows 消息,MFC提供了不同的消息映
射宏,主要分為如下六類(lèi):
1、Windows 消息映射宏 Windows 消息映射宏用于處理普通的窗口消息。此類(lèi)消息映射宏前綴為“ON_WM_”,并且沒(méi)有參數;
2、命令消息映射宏 命令消息 WM_COMMAND 是一種特殊的窗口消息,它從一個(gè)窗口發(fā)送到另一個(gè)窗口,以處理來(lái)自用戶(hù)的請求,是 ON_COMMAND 宏和 ON_COMMAND_RANGE 宏;
3、控件通知消息映射宏 控件通知消息是指控件窗口發(fā)送到其父窗口的消息,其消息映射宏為 ON_CONTROL 和 ON_CONTROL_RANGE,有時(shí)在程序中并不見(jiàn) ON_CONTROL 宏,而見(jiàn) ON_BN_CLICKED 宏, 其實(shí) ON_CONTROL 宏派生出許多的映射宏,包括 ON_BN_CLICKED 宏等;
4、控件通知消息映射宏 控件通知消息映射宏處理的窗口消息有 WM_COMMAND,WM_NOTIFY,其消息映射宏有 ON_NOTIFY 和 ON_NOTIFY_RANGE;
5、反射消息映射宏 反射消息是指子窗口向父窗口發(fā)送的通知消息或控件通知消息,父窗口將該消息轉化為相應的反射消息發(fā)送給子窗口優(yōu)先處理。 處理窗口消息 WM_NOTIFY+WM_REFLECT_BASE 的宏是 ON_NOTIFY_REFLECT,處理窗口消息 WM_COMMAND+WM_REFLECT_BASE 的宏是 ON_CONTROL_REFLECT, 還有其他的反射消息宏,具體請參考MDSN。
6、擴展消息映射宏 有 ON_COMMAND | ON_COMMAND_RANGE | ON_NOTIFY | ON_NOTIFY_RANGE ……
④、自定義消息的發(fā)送與響應:
1、自定義消息號:#define WM_CCTRY_MSG (WM_USER+100)
2、在頭文件中添加消息響應函數的聲明:afx_msg LRESULT OnCcTryMsg(WPARAM wParam, LPARAM lParam);
3、在CPP文件中添加消息響應函數的實(shí)現: LRESULT CXXXDlg::OnCcTryMsg(WPARAM wParam, LPARAM lParam) { //相關(guān)代碼; }
4、在 BEGIN_MESSAGE_MAP 與 END_MESSAGE_MAP 之間加入消息的映射代碼:ON_MESSAGE(WM_CCTRY_MSG, &CDlgTestDlg::OnCcTryMsg)
5、消息的發(fā)送:
聯(lián)系客服