一、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