比如这一段
BEGIN_MESSAGE_MAP(CSrvMonitorDlg, CDialog)
//{{AFX_MSG_MAP(CSrvMonitorDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP() CSrvMonitorDlg是宏,所以CSrvMonitorDlg类名不能传递给下面的宏ON_BN_CLICKED
那ON_BN_CLICKED中怎么知道是那一个类的OnButton1?
谁能详细说说?
BEGIN_MESSAGE_MAP(CSrvMonitorDlg, CDialog)
//{{AFX_MSG_MAP(CSrvMonitorDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP() CSrvMonitorDlg是宏,所以CSrvMonitorDlg类名不能传递给下面的宏ON_BN_CLICKED
那ON_BN_CLICKED中怎么知道是那一个类的OnButton1?
谁能详细说说?
至于之间的对应关系,一时也难以说清,建议你去看一下侯捷的《深入浅出MFC》,里头有详细的解释。
指定了消息映射到CSrvMonitorDlg
DECLARE_MESSAGE_MAP()宏的定义如下:
#define DECLARE_MESSAGE_MAP() \
private: \
static const AFX_MSGMAP_ENTRY _messageEntries[]; \
protected: \
static AFX_DATA const AFX_MSGMAP messageMap; \
virtual const AFX_MSGMAP* GetMessageMap() const; \#define ON_BN_CLICKED(id, memberFxn) \
ON_CONTROL(BN_CLICKED, id, memberFxn)// for general controls
#define ON_CONTROL(wNotifyCode, id, memberFxn) \
{ WM_COMMAND, (WORD)wNotifyCode, (WORD)id, (WORD)id, AfxSig_vv, \
(AFX_PMSG)&memberFxn },
看看文章
http://www.yesky.com/20010202/157456.shtml
就知道了。
其实这些宏就是在填充表格。需要时就从里面取出来。
而BEGIN_MESSAGE_MAP是实现部分,在.cpp文件中
BEGIN_MESSAGE_MAP,ON_WM_XXX,END_MESSAGE_MAP都是宏
//{{AFX_MSG_MAP(CSrvMonitorDlg)用于Class Wizzard
CSrvMonitorDlg, CDialog只是将类名作为宏参数而已
因为MFC维护了一个静态数组,这个数组的每一个元素记录了命令跟其处理函数的对应关系。而BEGIN_MESSAGE_MAP和END_MESSAGE_MAP正是为这个数组添加元素并赋值的
相当于Myclass::static_var[]={ ...,fun1,...,fun2 }吧...
但是我用gcc3做过类似的东西,是编译不过的,非要变为
Myclass::static_var[]={ ...,Myclass::fun1,...,Myclass::fun2 }才行
就是说消息映射从这里开始
CSrvMonitorDlg的基类是CDialog
以END_MESSAGE_MAP结束消息的映射
通过声明DECLARE_MESSAGE_MAP来传递以上定义的消息映射到窗口处理函数(在
SDK编程中比较明显,MFC中看过侯杰的MFC深入浅出也应该明白)