比如这一段
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?
谁能详细说说?

解决方案 »

  1.   

    BEGIN_MESSAGE_MAP是一个宏,表示开始消息映射,
    至于之间的对应关系,一时也难以说清,建议你去看一下侯捷的《深入浅出MFC》,里头有详细的解释。
      

  2.   

    BEGIN_MESSAGE_MAP(CSrvMonitorDlg, CDialog)
    指定了消息映射到CSrvMonitorDlg
      

  3.   

    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
      

  4.   

    这玩意,要说好久才能明白呢。《深入浅出MFC》里面讲的很清楚,建议看看
    就知道了。
    其实这些宏就是在填充表格。需要时就从里面取出来。
      

  5.   

    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只是将类名作为宏参数而已
      

  6.   

    大家不要都被那些宏所迷惑,建议去看看宏的定义是怎样的。MFC为什么会知道一个命令的处理函数在哪呢?
    因为MFC维护了一个静态数组,这个数组的每一个元素记录了命令跟其处理函数的对应关系。而BEGIN_MESSAGE_MAP和END_MESSAGE_MAP正是为这个数组添加元素并赋值的
      

  7.   

    BEGIN_MESSAGE_MAP和END_MESSAGE_MAP是消息处理的宏,他把消息处理程序组成一个网以便处理.可以看看侯杰的 深入浅出MFC 会有发现的
      

  8.   

    欢迎大家热烈讨论,宏我看过了.
    相当于Myclass::static_var[]={ ...,fun1,...,fun2 }吧...
    但是我用gcc3做过类似的东西,是编译不过的,非要变为
    Myclass::static_var[]={ ...,Myclass::fun1,...,Myclass::fun2 }才行
      

  9.   

    BEGIN_MESSAGE_MAP(CSrvMonitorDlg, CDialog)
    就是说消息映射从这里开始
    CSrvMonitorDlg的基类是CDialog
    以END_MESSAGE_MAP结束消息的映射
    通过声明DECLARE_MESSAGE_MAP来传递以上定义的消息映射到窗口处理函数(在
    SDK编程中比较明显,MFC中看过侯杰的MFC深入浅出也应该明白)