不明白BEGIN_MESSAGE_MAP

胖和尚minifat 2002-08-02 03:50: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?
谁能详细说说?
...全文
1349 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fhbkyo 2002-08-02
BEGIN_MESSAGE_MAP(CSrvMonitorDlg, CDialog)
就是说消息映射从这里开始
CSrvMonitorDlg的基类是CDialog
以END_MESSAGE_MAP结束消息的映射
通过声明DECLARE_MESSAGE_MAP来传递以上定义的消息映射到窗口处理函数(在
SDK编程中比较明显,MFC中看过侯杰的MFC深入浅出也应该明白)
回复
Gooder 2002-08-02
我嘛,是觉得拿来就用,知道是怎么用就好了,至于是怎么实现的,这个宏是如何定义的,我不想弄得太深了,否则太专于技术方面,而忘了编写程序时的逻辑思维,其实这才是我们真正编程时要解决的事情
回复
胖和尚minifat 2002-08-02
恩,我一直想搞明白到底是我写的程序的错,还是vc不符合标准.
回复
胖和尚minifat 2002-08-02
欢迎大家热烈讨论,宏我看过了.
相当于Myclass::static_var[]={ ...,fun1,...,fun2 }吧...
但是我用gcc3做过类似的东西,是编译不过的,非要变为
Myclass::static_var[]={ ...,Myclass::fun1,...,Myclass::fun2 }才行
回复
liuns 2002-08-02
BEGIN_MESSAGE_MAP和END_MESSAGE_MAP是消息处理的宏,他把消息处理程序组成一个网以便处理.可以看看侯杰的 深入浅出MFC 会有发现的
回复
jingyad 2002-08-02
大家不要都被那些宏所迷惑,建议去看看宏的定义是怎样的。

MFC为什么会知道一个命令的处理函数在哪呢?
因为MFC维护了一个静态数组,这个数组的每一个元素记录了命令跟其处理函数的对应关系。而BEGIN_MESSAGE_MAP和END_MESSAGE_MAP正是为这个数组添加元素并赋值的
回复
yichunhui 2002-08-02
楼上说得对。
回复
xingchen_ak 2002-08-02
DECALRE_MESSAGE_MAP是声明部分,一般在声明类的.h文件中
而BEGIN_MESSAGE_MAP是实现部分,在.cpp文件中
BEGIN_MESSAGE_MAP,ON_WM_XXX,END_MESSAGE_MAP都是宏
//{{AFX_MSG_MAP(CSrvMonitorDlg)用于Class Wizzard
CSrvMonitorDlg, CDialog只是将类名作为宏参数而已

回复
tomPeakz 2002-08-02
这玩意,要说好久才能明白呢。《深入浅出MFC》里面讲的很清楚,建议看看
就知道了。
其实这些宏就是在填充表格。需要时就从里面取出来。
回复
wistaria 2002-08-02
DECLARE_MESSAGE_MAP()
  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
回复
Paris_Luo 2002-08-02
BEGIN_MESSAGE_MAP(CSrvMonitorDlg, CDialog)
指定了消息映射到CSrvMonitorDlg
回复
thundersp 2002-08-02
BEGIN_MESSAGE_MAP是一个宏,表示开始消息映射,
至于之间的对应关系,一时也难以说清,建议你去看一下侯捷的《深入浅出MFC》,里头有详细的解释。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告