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