MFC 三種消息


MFC應用程序中傳輸的消息有三種類型:窗口消息、命令消息和控件通知。  

(1)窗口消息:WM_XXX

      窗口消息(Window Message)一般與窗口的內部運作有關,如:創建窗口、繪制窗口和銷毀窗口等。通常,消息是從系統發送到窗口,或從窗口發送到窗口。  

(2)命令消息:WM_COMMAND

      命令消息一般與處理用戶請求相關,當用戶單擊一個菜單項或工具欄時,命令消息產生,並被發送到能處理該請求的類對象(如:裝載文件、編輯文本和保存選項等)。  

(3)控件通知:有多種格式       通常,控件通知在某些重要事件發生時,由控件窗口發送到父窗口,如打開一個組合框。控件通知為父窗口進一步控制子窗口提供了機會。例如,打開一個組合框時,父窗口可以用組合框初建時得不到的消息填充它。  

      BN_XXXX是CButton產生的消息,EN_XXXX是CEdit產生的消息,等等。

 

這個博客寫的比較詳細http://blog.csdn.net/zhanglidn013/article/details/6958257

下面這個通知消息我比較模糊:

Windows自定義的子窗口控件(Predefined Chilld Window Controls)包括BUTTON、COMBOBOX、EDIT、LISTBOX、RichEdit、SCROLLBAR、STATIC。

以上Windows預定義的子窗口控件的窗口過程中做了反射處理,即在某一事件(點擊菜單,點擊加速鍵,點擊子窗口按鈕,點擊工具欄按鈕)處理后發送一個WM_COMMAND通知消息給父窗口。這樣某個事件發生了,子窗口做默認處理后,父窗口可以做后續處理使父子窗口工作協調。例如按下按鈕,按鈕呈凹陷狀,這是由BtnProc對WM_LBUTTONDOWN(WM_PAINT)的重繪處理;松開按鈕,按鈕恢復原態,這是由BtnProc對WM_LBUTTONUP(WM_PAINT)的重繪處理。往往在松開按鈕的時候,發送WM_COMMAND消息(消息碼為BN_CLICKED)給父窗口,由父窗口做點擊事件響應,這樣便於狀態和邏輯的分離。

 

還有消息映射 消息反射之分。

 

①、映射機制的原理 Windows 下的程序包括 Windows 系統都是基於消息機制的。 MFC消息映射機制的具體實現方法是:在每個能接收和處理消息的類中,定義一個消息和消息響應函數的靜態對照表,即消息映射表; 在消息映射表中,消息與對應的消息處理函數指針是成對出現的。某個類能處理的所有消息及其對應的消息處理函數的地址都列在這個類所對應的靜態表中; 當有消息需要處理時,程序只要搜索該消息靜態表,查看表中是否含有該消息,就可以知道該類能否處理此消息; 如果能處理該消息,則同樣依照靜態表能很容易找到並調用對應的消息處理函數!


②、一般情況下,一個MFC的消息映射在程序中有三處相關信息:1》消息響應函數的聲明 2》消息響應函數實現 3》用來關聯消息和消息響應函數的宏 具體見示例代碼……更為詳細的講解參見《深入淺出MFC 第二版 簡體中文版》 - 侯傑:http://www.cctry.com/thread-192-1-1.html
③、針對不同的 Windows 消息,MFC提供了不同的消息映

射宏,主要分為如下六類:


1、Windows 消息映射宏 Windows 消息映射宏用於處理普通的窗口消息。此類消息映射宏前綴為“ON_WM_”,並且沒有參數;


2、命令消息映射宏 命令消息 WM_COMMAND 是一種特殊的窗口消息,它從一個窗口發送到另一個窗口,以處理來自用戶的請求,是 ON_COMMAND 宏和 ON_COMMAND_RANGE 宏;


3、控件通知消息映射宏 控件通知消息是指控件窗口發送到其父窗口的消息,其消息映射宏為 ON_CONTROL 和 ON_CONTROL_RANGE,有時在程序中並不見 ON_CONTROL 宏,而見 ON_BN_CLICKED 宏, 其實 ON_CONTROL 宏派生出許多的映射宏,包括 ON_BN_CLICKED 宏等;


4、控件通知消息映射宏 控件通知消息映射宏處理的窗口消息有 WM_COMMAND,WM_NOTIFY,其消息映射宏有 ON_NOTIFY 和 ON_NOTIFY_RANGE;


5、反射消息映射宏 反射消息是指子窗口向父窗口發送的通知消息或控件通知消息,父窗口將該消息轉化為相應的反射消息發送給子窗口優先處理。 處理窗口消息 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 ……

④、自定義消息的發送與響應:

1、自定義消息號:#define WM_CCTRY_MSG (WM_USER+100)

2、在頭文件中添加消息響應函數的聲明:afx_msg LRESULT OnCcTryMsg(WPARAM wParam, LPARAM lParam);

3、在CPP文件中添加消息響應函數的實現: LRESULT CXXXDlg::OnCcTryMsg(WPARAM wParam, LPARAM lParam) { //相關代碼; }

4、在 BEGIN_MESSAGE_MAP 與 END_MESSAGE_MAP 之間加入消息的映射代碼:ON_MESSAGE(WM_CCTRY_MSG, &CDlgTestDlg::OnCcTryMsg)

5、消息的發送:

 

消息反射解釋

 

父窗口將控制子窗口發給它的通知消息,首先反射回子窗口進行處理(即給控制子窗口一個機會,讓控制子窗口處理此消息),這樣通知消息就有機會能被子窗口自身進行處理。

 

MFC中引入消息反射的原因

 

在Windows的消息處理中,控制子窗口的發給其父窗口的通知消息只能由其父窗口進行處理,這使得控制子窗口的自身能動性大大降低(你想,它連改變自己的背景色,處理一個自身滾動問題都要其父窗口來完成),為了解決這個問題,在MFC中引入了反射消息“Reflect Message”的概念,進行消息反射,可以使得控制子窗口能夠自行處理與自身相關的一些消息,增強了封裝性,從而提高了控制子窗口的可重用性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM