打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
消息映射深度探索(3):使用宏简化操作

消息映射深度探索(3):使用宏简化操作

231人阅读 评论(0) 收藏 举报
消息映射网的建立可以用宏定义出来,以简化派生类的操作:

#include <iostream>
#include <map>
#include <cassert>

#define PRINT( msg ) { std::cout << msg << std::endl; }
#define FUNC( func ) void func() { PRINT( #func##"()" ); }
#define MFUNC( class, func ) void func() { PRINT( #class##"::"###func##"()" ); }
#define VMFUNC( class, func ) virtual MFUNC( class, func )

enum MsgID {
    MsgID_1,
    MsgID_2,
};

namespace MFCMacro {
    class Wnd;
    typedef void (Wnd::*MemberFunc)();
    typedef std::map< int, MemberFunc > MsgRegistry;   

    struct MsgMap {
        const MsgRegistry& thisMsgRegistry;
        const MsgMap* baseMsgMap;
    };

/* MACRO BEGIN *///////////////////////////////////////////////////////////
#define MSG_BEGIN( theClass, baseClass )                        /
protected:                                                      /
    virtual const MsgMap& GetMsgMap() const {                   /
        static MsgMap msgMap = {                                /
            GetInitilizedMsgRegistry##theClass(),               /
            &baseClass::GetMsgMap()                             /
        };                                                      /
        return msgMap;                                          /
    }                                                           /
private:                                                        /
    MsgRegistry& GetInitilizedMsgRegistry##theClass() const {   /
        static MsgRegistry thisMsgRegistry;                

#define MSG_ENTRY( id, func )                                   /
        thisMsgRegistry.insert( std::make_pair( id, (MemberFunc)func ) );

#define MSG_END()                                               /
        return thisMsgRegistry;                                 /
    }
/* MACRO END *////////////////////////////////////////////////////////////

    class Wnd {
        ...   
    };

    class MyWnd : public Wnd {
        MSG_BEGIN( MyWnd, Wnd )
            MSG_ENTRY( MsgID_1, &MyWnd::Handle1 )           
        MSG_END()
    private:
        MFUNC( MyWnd, Handle1 );       
    };   
}

namespace AutoTest {
    void TestMFCMacroMsgMap() {
        using namespace MFCMacro;
        Wnd* wnd = new MyWnd;
        wnd->HandleMsg( MsgID_1 );
        wnd->HandleMsg( MsgID_2 );
    }
}

void main() {
    AutoTest::TestMFCMacroMsgMap();
}

注意

为了表述方便,上面所示的宏直接将消息映射的定义部分放在类声明中。
你也可以像MFC那样将声明和实现分开:

声明
DECLARE_MESSAGE_MAP()

实现
BEGIN_MESSAGE_MAP()
 ON_WM_XXX()
 ON_COMMAND()
 ON_MESSAGE()
 ...
END_MESSAGE_MAP()
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
[Chrome源码阅读]IPC通信初探
C语言日志分级如何设计?
C宏——智者的利刃,愚者的恶梦!
duilib 消息宏分析
MFC-消息分派
Accepting Unicode input in your Windows application , Unicode input in Windows NT4, 2000, XP, Vista
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服