應用程序框架產生的消息映射函數
例如: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: Add your control notification handler code here
……
}??
在afxwin.h中afx_msg的解釋:?
? #ifndef?? afx_msg?
? #define?? afx_msg?????????????????? //?? intentional?? placeholder?
? #endif?
??? 沒什么意思.只是定義了這個符號而已.?? 這個對編譯器來說,相當于什么都沒有,對于人來說,我們可以看到這樣的符號.??
對于類向導來說.這個符號才是有意義的.它是一個消息處理函數的前綴.?? 類向導生成的消息函數,分發函數,事件響應函數都以這個為前綴.?
?如果去掉了,向導將不能識別
?
?
DECLARE_MESSAGE_MAP的理解
在一些資料上,有這么一段文字:
DECLARE_MESSAGE_MAP()
說明:
用戶程序中的每個CCmdTarget派生類必須提供消息映射以處理消息。在類定義的末尾使用DECLARE_MESSAGE_MAP宏。接著,在定義類成員函數的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,每個用戶消息處理函數的宏項下面的列表以及END_MESSAGE_MAP宏。
注釋:
如果在DECLARE_MESSAGE_MAP之后定義任何一個成員,那么必須為他們指定一個新存取類型(公共的,私有的,保護的)。
我覺得他描述得欠妥,我的理解是:
只要有:只要是CCmdTarget(用于所有能夠消息映射的基類)派生類,必有消息映射以處理消息,則在類的說明文件的尾部有DECLARE_MESSAGE_MAP宏,在類的定義文件中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以處理用戶消息。
其中BEGIN_MESSAGE_MAP(參數1,參數2) ,參數1為該類的類名,參數2為該類基類的類名。
其中ON_MESSAGE(參數1,參數2),參數1為響應的消息,參數2為該消息對應的處理的函數名。
BEGIN_MESSAGE_MAP(CH264PlayerDlg, CDialog)
//{{AFX_MSG_MAP(CH264PlayerDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_BN_CLICKED(IDC_PLAY, OnPlay)
ON_COMMAND(IDR_FILE_OPEN, OnFileOpen)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_COMMAND(IDR_VIEW_FULLSCRREN, OnViewFullscrren)
ON_COMMAND(IDR_VIEW_ORIGINALSIZE, OnViewOriginalsize)
ON_WM_LBUTTONDBLCLK()
ON_BN_CLICKED(IDC_CUTPIC, OnCutPicture)
ON_COMMAND(IDR_ABOUTBOX, OnAboutbox)
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
?
MFC BEGIN_MESSAGE_MAP()
簡單用法:
BEGIN_MESSAGE_MAP(CpassApp, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
這些都是宏定義,不是函數。
在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之間添加你的消息響應函數,為每個消息處理函數加入一個入口
BEGIN_MESSAGE_MAP( theClass, baseClass )
參數:
theClass | 指定消息映射所屬的類的名字。 |
baseClass | 指定theClass的基類的名字。 |
說明:
使用BEGIN_MESSAGE_MAP宏開始你的消息映射的定義。
在你的類的成員函數的實現文件(.CPP)中,使用BEGIN_MESSAGE_MAP宏開始消息映射,然后為每個消息處理函數加入一個入口,最后用END_MESSAGE_MAP宏結束消息映射。
每個消息映射入口的格式如下:
ON_Notification(id, memberFxn)
其中id指定了發送通知的控件的子窗口的ID,而memberFxn指定了處理該通知的父對象中的成員函數名。
父對象的函數原型格式如下:
afx_msg void memberFxn( );
可能的消息映射入口如下:
映射入口 | 何時向父對象發送消息 |
ON_BN_CLICKED | 用戶單擊按鈕時 |
ON_BN_DOUBLECLICKED | 用戶雙擊按鈕時 |