消息映射深度探索(3):使用宏简化操作
来源:互联网 发布:保定seo价格 编辑:程序博客网 时间:2024/06/09 16:36
转自:http://blog.csdn.net/hjsunj/article/details/2028597
消息映射网的建立可以用宏定义出来,以简化派生类的操作:
#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()
- 消息映射深度探索(3):使用宏简化操作
- 消息映射深度探索
- 消息映射深度探索(2):MFC的做法 - 使用消息映射表
- 消息映射深度探索(1):基础面
- 消息映射深度探索(5):总结
- 消息映射深度探索(4):职责链模式 - 使用虚函数替换映射表
- 深度探索WM_PAINT消息
- 深度探索WM_PAINT消息
- 利用Message Crackers简化消息映射
- 利用Message Crackers简化消息映射
- 探索MFC笔记——消息映射
- 使用主动实体(ActiveEntity)简化继承体系映射类的写操作
- 使用elif分支代替映射简化设计
- 使用.NET简化RSS操作
- 使用DBUtiles简化JDBC操作
- 使用jOOR简化反射操作
- 使用Spring JMS简化异步消息处理
- 使用Spring JMS简化异步消息处理
- 转:linux的硬链接和软连接
- HDU1334:Perfect Cubes
- 消息映射深度探索(1):基础面
- 消息映射深度探索(2):MFC的做法 - 使用消息映射表
- ch05 ex editor
- 消息映射深度探索(3):使用宏简化操作
- 源代码下载网站
- 消息映射深度探索(4):职责链模式 - 使用虚函数替换映射表
- 在Visual C++ 2005中使用 GNU Scientific Library
- Baidu Astar 130427
- 动、静态库编译顺序
- 消息映射深度探索(5):总结
- 9、C++程序中内存区域划分
- 俄罗斯方块