不明白BEGIN_MESSAGE_MAP

胖和尚minifat 2002-08-02 03:51:07
比如这一段
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?
谁能详细说说?
...全文
88 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
胖和尚minifat 2002-08-02
  • 打赏
  • 举报
回复
恩,我一直想搞明白到底是我写的程序的错,还是vc不符合标准.
FFXI 2002-08-02
  • 打赏
  • 举报
回复
这是有可能的,不同的编译器对代码的分析也不同。实际上,我认为gcc在很多方面要比VC的编译器要规范和强大。
胖和尚minifat 2002-08-02
  • 打赏
  • 举报
回复
欢迎大家热烈讨论,宏我看过了.
相当于Myclass::static_var[]={ ...,fun1,...,fun2 }吧...
但是我用gcc3做过类似的东西,是编译不过的,非要变为
Myclass::static_var[]={ ...,Myclass::fun1,...,Myclass::fun2 }才行
liu_feng_fly 2002-08-02
  • 打赏
  • 举报
回复
买一本《深入浅出mfc》看看就知道了。
FFXI 2002-08-02
  • 打赏
  • 举报
回复
观察宏定义:

#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap() \
{ return &baseClass::messageMap; } \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \

BEGIN_MESSAGE_MAP(CSrvMonitorDlg, CDialog)定义了类CSrvMonitorDlg的成员函数和成员数组。因为ON_BN_CLICKED()定义在成员数组中,OnButton1被编译器认为是成CSrvMonitorDlg::OnButton1();而在CSrvMonitordlg的消息循环中,会在这个数组中寻找是否存在重载的Message Handler.找到后就会调用相应的Handler.由此,发给CSrvMonitordlg的IDC_BUTTON1的WM_COMMAND就会被交给CSrvMonitordlg::OnButton1()处理.
liushmh 2002-08-02
  • 打赏
  • 举报
回复
IDC_BUTTON1
IDC_BUTTON3
IDC_BUTTON2
根据这些来判断
采用的是消息映射机制
你把button控件的IDC_BUTTON1等名称改改

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧