随笔-19  评论-2  文章-0  trackbacks-0

2009-9-2
======================
《深入解析MFC》笔记 6.MFC消息处理、消息映射
======================


    CCmdTarget和消息映射表
    -窗口消息
        3个部分:1)一个无符号整数,包含了消息的实际内容; 2)WPARAM—— 一个4字节的参数;3)LPARAM—— 一个4字节的参数
       
    MFC消息映射
        CCmdTarget类
        消息映射表数据结构:
                AFX_MSGMAP_ENTRY,表示消息映射表的实际入口:
                struct AFX_MSGMAP_ENTRY{
                    UINT nMessage;          //表示Windows消息。
                    UINT nCode;               //表示控件代码或WM_NOTIFY代码
                    UINT nID;                    //产生消息的控件ID
                    UINT nLastID;              //
                    UINT nSig;                   //表示用于处理消息的函数的签名(signature)
                    AFX_PMSG pfn;           //指向处理消息的函数
                };
               
                typedef  void  (CCmdTarget::*AFX_PMSG) (void);
               
                struct AFX_MSGMAP{
                    const AFX_MSGMAP*  pBaseMap;                //指向另一个AFX_MSGMAP结构的指针(基类的消息映射表)
                    const AFX_MSGMAP_ENTRY*  lpEntries;        //
                };
                消息映射表基本上就是AFX_MSGMAP_ENTRY结构数组。
               
        消息映射宏
            DECLARE_MESSAGE_MAP、  BEGIN_MESSAGE_ MAP   和   END_MESSAGE_MAP.
            在类定义中使用DECLARE_MESSAGE_MAP意味着在类中定义了3种东西:
                1)一个名为_messageEntries 的 AFX_MSGMAP_ENTRY 结构数组;        (静态成员)
                2)一个名为messageMap 的 AFX_MSGMAP;                                    (静态成员)
                3)一个获得类的消息映射表的函数(GetMessageMap())。
            #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
                PTM_WARNING_DISABLE \
                    const AFX_MSGMAP* theClass::GetMessageMap() const \     
                            { return GetThisMessageMap(); } \
                    const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
                        { \
                            typedef theClass ThisClass;   \
                            typedef baseClass TheBaseClass;   \
                            static const AFX_MSGMAP_ENTRY _messageEntries[] =  \
                        {
                宏产生一个GetMessageMap()函数,该函数返回类的消息映射表指针。框架程序用GetMessageMap()来获得类的消息映射表。
                然后宏产生填充AFX_MSGMAP结构的代码。第一个域指向基类的消息映射表,同时创建一条到根对象的链表。
            第二个域是指向类自己的第一个消息映射表的入口。
                最后,宏产生实际的消息表,消息表实际上就是AFX_MSGMAP_ENTRY结构的表。
            #define END_MESSAGE_MAP() \
                {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
                ;
               
        MFC如何使用消息映射表
               
    ---------------------------------------            
    Command Routing(命令传递)
        ■ 若是一般的 Windows消息(WM_xxx),一定由派生类流向基类
        ■ 若是命令消息 WM_COMMAND
                Frame窗口: View    →  Frame窗口本身  →  CWinApp对象
                                      ↓
                                    View:  View本身 →  Document
                                                                            ↓           
                                                                     Document:  Document本身→ DocumentTemplate
           

 

 

posted on 2010-03-15 23:14 Euan 阅读(876) 评论(0)  编辑 收藏 引用 所属分类: windows

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理