友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第54章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






172 


…………………………………………………………Page 235……………………………………………………………

                                                       第3章    MFC 六大關鍵技術之模擬 



 于是,DECLARE_MESSAGE_MAP 就相当于声明了这样一个数据结构: 



                                                        pBaseMessageMap 

                         _messageEntries'' 

                                                            lpEntries 

                nMessage; nCode; nID; nLastID; nSig; pfn 



                                                          messageMap 



这个数据结构的内容填塞工作由三个宏完成: 



#define BEGIN_MESSAGE_MAP (theClass; baseClass)  

        AFX_MSGMAP* theClass::GetMessageMap() const  

                { return &theClass::messageMap; }  

        AFX_MSGMAP theClass::messageMap =  

        { &(baseClass::messageMap);  

                (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) };  

        AFX_MSGMAP_ENTRY theClass::_messageEntries'' =  

        { 



#define ON_MAND (id; memberFxn)  

        { WM_MAND; 0; (WORD)id; (WORD)id; AfxSig_vv; (AFX_PMSG)memberFxn }; 



#define END_MESSAGE_MAP ()  

        { 0; 0; 0; 0; AfxSig_end; (AFX_PMSG)0 }  

        }; 



其中的AfxSig_end 定义为: 



enum AfxSig 

{ 

        AfxSig_end = 0;     // 'marks end of message map' 

        AfxSig_vv;    

}; 



 AfxSig_xx 用来描述消息处理例程memberFxn  的类型(参数与回返值)。本例纯为仿真 



 与简化,所以不在这上面作文章。真正讲到MFC 时(第四篇p580 ),我会再解释它。 



                                                                                             173 


…………………………………………………………Page 236……………………………………………………………

                   第篇  勿在浮砂築高台 



                    于是,以CView 为例,下面的源代码: 



                      // in header file 

                      class CView : public CWnd 

                      { 

                      public: 

                        。。。 

                        DECLARE_MESSAGE_MAP() 

                      }; 



                      // in implementation file 

                      #define CViewid 122 

                       。。。 

                      BEGIN_MESSAGE_MAP(CView; CWnd) 

                        ON_MAND(CViewid; 0) 

                      END_MESSAGE_MAP() 



                    就被展开成为: 



                      // in header file 

                      class CView : public CWnd 

                      { 

                      public: 

                        。。。 

                        static AFX_MSGMAP_ENTRY _messageEntries''; 

                        static AFX_MSGMAP messageMap; 

                        virtual AFX_MSGMAP* GetMessageMap() const; 

                      }; 



                      // in implementation file 

                      AFX_MSGMAP* CView::GetMessageMap() const 

                              { return &CView::messageMap; } 

                      AFX_MSGMAP CView::messageMap = 

                      { &(CWnd::messageMap); 

                              (AFX_MSGMAP_ENTRY*) &(CView::_messageEntries) }; 

                      AFX_MSGMAP_ENTRY CView::_messageEntries'' = 

                      { 

                        { WM_MAND; 0; (WORD)122; (WORD)122; 1; (AFX_PMSG)0 }; 

                        { 0; 0; 0; 0; 0; (AFX_PMSG)0 } 

                      }; 



                    以图表示则为: 



174 


…………………………………………………………Page 237……………………………………………………………

                                                     第3章    MFC 六大關鍵技術之模擬 



                                                       CWnd::messageMap 



                                                         pBaseMessageMap 

                   CView::_messageEntries'' 

                                                              lpEntries 

         WM_MAND;  0;  122;  122;   1;  (AFX_PMSG)0 



                 0; 0; 0; 0; 0; (AFX_PMSG)0             CView::messageMap 



  我们还可以定义各种类似ON_MAND 这样的宏,把各式各样的消息与特定的处 



  理例程关联起来。MFC 里头就有名为ON_ WM_PAINT 、ON_ WM_CREATE、ON_ WM_SIZE。。。 



  等等的宏。 



  我在Frame7 范例程序中为CCmdTarget  的每一衍生类别都产生类似上图的消息映射表: 



// in header files 

class CObject 

{ 

     。。。 // 注意:CObject 并不属于消息流动网的一份子。 

}; 

class CCmdTarget : public CObject 

{ 

。。。 

  DECLARE_MESSAGE_MAP() 

}; 

class CWinThread : public CCmdTarget 

{ 

 。。。 // 注意:CWinThread 并不属于消息流动网的一份子。 

}; 

class CWinApp : public CWinThread 

{ 

。。。 

  DECLARE_MESSAGE_MAP() 

}; 

class CDocument : public CCmdTarget 

{ 

。。。 

  DECLARE_MESSAGE_MAP() 

}; 

class CWnd : public CCmdTarget 

{ 

。。。 

  DECLARE_MESSAGE_MAP() 



                                                                                         175 


…………………………………………………………Page 238……………………………………………………………

                  第篇  勿在浮砂築高台 



                  }; 

                  class CFrameWnd : public CWnd 

                  { 

                  。。。 

                    DECLARE_MESSAGE_MAP() 

                  }; 

                  class CView : public CWnd 

                  { 

                  。。。 

                    DECLARE_MESSAGE_MAP() 

                  }; 

                  class CMyWinApp : public CWinApp 

                  { 

                  。。。 

                    DECLARE_MESSAGE_MAP() 

                  }; 

                  class CMyFrameWnd : public CFrameWnd 

                  { 

                  。。。 

                    DECLARE_MESSAGE_MAP() 

                  }; 

                  class CMyDoc : public CDocument 

                  { 

                  。。。 

                    DECLARE_MESSAGE_MAP() 

                  }; 

                  class CMyView : public CView 

                  { 

                  。。。 

                    DECLARE_MESSAGE_MAP() 

                  }; 



                  并且把各消息映射表的关联性架设起来,给予初值(每一个映射表都只有ON_MAND 



                  一个项目): 



                  // in implementation files 

                  BEGIN_MESSAGE_MAP(CWnd; CCmdTarget) 

                  ON_MAND(CWndid; 0) 

                  END_MESSAGE_MAP() 



                  BEGIN_MESSAGE_MAP(CFrameWnd; CWnd) 

                  ON_MAND(CFrameWndid; 0) 

                  END_MESSAGE_MAP() 



                  BEGIN_MESSAGE_MAP(CDocument; CCmdTarget) 



176 


…………………………………………………………Page 239……………………………………………………………

                                                    第3章    MFC 六大關鍵技術之模擬 



ON_MAND(CDocumentid; 0) 

END_MESSAGE_MAP() 



BEGIN_MESSAGE_MAP(CView; CWnd) 

ON_MAND(CViewid; 0) 

END_MESSAGE_MAP() 



BEGIN_MESSAGE_MAP(CWinApp; CCmdTarget) 

ON_MAND(CWinAppid; 0) 

END_MESSAGE_MAP() 



BEGIN_MESSAGE_MAP(CMyWinApp; CWinApp) 

ON_MAND(CMyWinAppid; 0) 

END_MESSAGE_MAP() 



BEGIN_MESSAGE_MAP(CMyFrameWnd; CFrameWnd) 

ON_MAND(CMyFrameWndid; 0) 

END_MESSAGE_MAP() 



BEGIN_MESSAGE_MAP(CMyDoc; CDocument) 

ON_MAND(CMyDocid; 0) 

END_MESSAGE_MAP() 



BEGIN_MESSAGE_MAP(CMyView; CView) 

ON_MAND(CMyViewid; 0) 

END_MESSAGE_MAP() 



同时也设定了消息的终极镖靶CCmdTarget  的映射表内容: 



AFX_MSGMAP CCmdTarget::messageMap = 

 { 

        NULL; 

        &CCmdTarget::_messageEntries'0' 

 }; 



AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries'' = 

 { 

        { 0; 0; CCmdTargetid; 0; AfxSig_end; 0 } 

 }; 



于是,整个消息流动网就隐然成形了(图3…5 )。 



                                                                                       177 


…………………………………………………………Page 240……………………………………………………………

                           第篇  勿在浮砂築高台 



                                                    CWinThread       CWinApp        CMyWinApp 



                            
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!