DECLARE_MESSAGE_MAP() 等消息映射宏以及 afx_msg消息映射函數

一、DECLARE_MESSAGE_MAP(),BEGIN_MESSAGE_MAP(),END_MESSAGE_MAP()

DECLARE_MESSAGE_MAP()宏的作用是向類中添加消息i映射必要的結構體和函數聲明,只需要添加一次,放在什麼位置並不重要,就如同類裏其他普通函數的聲明可以相互交換順序一樣。

函數的修飾符也是可以自己決定的,遵循一般原則。比如你需要在類外部也可以調用該消息響應函數,就可以定義成public的。

但是其實真正的消息映射是在cpp文件裏面的
BEGAIN_MESSAGE_MAP()
END_MESSAGE_MAP()

這兩個宏之間

比如:
h:
在這裏插入圖片描述
cpp:
在這裏插入圖片描述
如上大體意思就是:只要是CCmdTarget(用於所有能夠消息映射的基類)派生類,必有消息映射以處理消息,則在類的說明文件的尾部有DECLARE_MESSAGE_MAP宏,在類的定義文件中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以處理用戶消息。
其中BEGIN_MESSAGE_MAP(參數1,參數2) ,參數1爲該類的類名,參數2爲該類基類的類名。

在一些資料上,也書面的說明爲:
用戶程序中的每個CCmdTarget派生類必須提供消息映射以處理消息。在類定義的末尾使用DECLARE_MESSAGE_MAP宏。接着,在定義類成員函數的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,及END_MESSAGE_MAP宏。
(如果在DECLARE_MESSAGE_MAP之後定義任何一個成員,那麼必須爲他們指定一個新存取類型(公共的,私有的,保護的))

二、afx_msg函數

應用程序框架產生的消息映射函數
例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg爲消息標誌,它向系統聲明:有消息映射到函數實現體;
而在map宏定義中,就有具體消息和此函數的映射定義(可以是自定義,也可以是系統自動完成的)
afx是 application framework
如定義一個Edit的Change處理函數:

也可參照以上文中圖片例子

一、在類的頭文件(*.h)中增加 :

  //{{AFX_MSG(CDialogDemo)   
  afx_msg  void OnChangeEdit1();
  //{{AFX_MSG   

二、在類的實現文件(*.cpp)中增加:

1.消息定義( ON_EN_CHANGE):

BEGIN_MESSAGE_MAP(CDialogDemo, CDialog)
//{{AFX_MSG_MAP()   
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
 //}}AFX_MSG_MAP   
END_MESSAGE_MAP()   

2.執行函數:

void CDialogDemo::OnChangeEdit1() 
{
 TODO: 添加你的控件相關代碼
……
}  

在afxwin.h中afx_msg的解釋:

 #ifndef   afx_msg  
  #define   afx_msg                   //   intentional   placeholder  
  #endif  

沒什麼意思.只是定義了這個符號而已. 這個對編譯器來說,相當於什麼都沒有,對於人來說,我們可以看到這樣的符號. 。

對於類嚮導來說.這個符號纔是有意義的.它是一個消息處理函數的前綴. 類嚮導生成的消息函數,分發函數,事件響應函數都以這個爲前綴.
如果去掉了,嚮導將不能識別

三、自己添加的消息

如果是自己寫的afx_msg函數,則需自己在cpp中添加消息處理代碼

ON_MESSAGE(參數1,參數2

其中參數1是自己定義的消息ID,參數2是函數名
例如:
在這裏插入圖片描述
其中消息ID是自己定義的
在這裏插入圖片描述
其中WM_USER宏定義可以看我的另一篇文章介紹
https://blog.csdn.net/weixin_45525272/article/details/106426221

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章