消息映射深度探索(1):基础面
2013-04-27 20:56
281 查看
转自:http://blog.csdn.net/hjsunj/article/details/2028597
消息映射这项技术,给消息横向(多个类对象)或纵向(继承树)流动的机会。
此技术最初之发展动机是为了简化win32程序的消息处理过程,后来也被应用到网络程序的消息处理。一旦某个消息到达win32消息处理函数,此函数就会 使用一个switch...case映射网将此消息映射至相应处理函数。switch...case具有与生俱来的缺点:难于扩展,效率低下。随着消息的 增多,switch...case将变得庞大而不堪重负。消息映射可以解决这个问题,因为当对象运用了消息映射技术后,对象自己就能够处理消息(或者说对外界宣告,我能处理这个消息,请把它交给我处理)。
消息映射架构在一大堆有趣的细节之上。在深入到细枝末节前,先让我们看下基础面:传统的不使用消息映射程序是如何实作的?下面是一种可能:
void HandleMessage( Message* message ) {
switch ( message->GetID() ) {
case MessageID_A:
FunctionA( message );
break;
...
case MessageID_N:
FunctionN( message );
break;
default:
assert( false && "Unknown message" );
}
}
这个做法几乎不具备任何扩展性,如果HandleMessage()被封装到库中那就意味着用户不再有任何修改的机会,那么用户该如何针对自己喜爱的消息做特殊处理,而忽略那些不打算处理的消息呢?
继续前行之前,我们先来了解几个将被使用的宏:
#include <iostream>
#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 )
namespace AutoTest {
FUNC( func );
struct TestStruct {
MFUNC( TestStruct, func );
VMFUNC( TestStruct, vfunc );
};
void TestPRINT() {
PRINT( "PRINT()" );
func();
TestStruct t;
t.func();
t.vfunc();
}
}
void main() {
AutoTest::TestPRINT();
}
这里列出了一些宏,用于打印或者产生一些简单的全局打印函数或者成员函数。
消息映射这项技术,给消息横向(多个类对象)或纵向(继承树)流动的机会。
此技术最初之发展动机是为了简化win32程序的消息处理过程,后来也被应用到网络程序的消息处理。一旦某个消息到达win32消息处理函数,此函数就会 使用一个switch...case映射网将此消息映射至相应处理函数。switch...case具有与生俱来的缺点:难于扩展,效率低下。随着消息的 增多,switch...case将变得庞大而不堪重负。消息映射可以解决这个问题,因为当对象运用了消息映射技术后,对象自己就能够处理消息(或者说对外界宣告,我能处理这个消息,请把它交给我处理)。
消息映射架构在一大堆有趣的细节之上。在深入到细枝末节前,先让我们看下基础面:传统的不使用消息映射程序是如何实作的?下面是一种可能:
void HandleMessage( Message* message ) {
switch ( message->GetID() ) {
case MessageID_A:
FunctionA( message );
break;
...
case MessageID_N:
FunctionN( message );
break;
default:
assert( false && "Unknown message" );
}
}
这个做法几乎不具备任何扩展性,如果HandleMessage()被封装到库中那就意味着用户不再有任何修改的机会,那么用户该如何针对自己喜爱的消息做特殊处理,而忽略那些不打算处理的消息呢?
继续前行之前,我们先来了解几个将被使用的宏:
#include <iostream>
#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 )
namespace AutoTest {
FUNC( func );
struct TestStruct {
MFUNC( TestStruct, func );
VMFUNC( TestStruct, vfunc );
};
void TestPRINT() {
PRINT( "PRINT()" );
func();
TestStruct t;
t.func();
t.vfunc();
}
}
void main() {
AutoTest::TestPRINT();
}
这里列出了一些宏,用于打印或者产生一些简单的全局打印函数或者成员函数。
相关文章推荐
- 消息映射深度探索(2):MFC的做法 - 使用消息映射表
- 消息映射深度探索(3):使用宏简化操作
- 消息映射深度探索(5):总结
- 消息映射深度探索(4):职责链模式 - 使用虚函数替换映射表
- 深度学习基础理论探索(二): cross-entropy损失函数的前世今生
- 深度探索WM_PAINT消息(K_ECKEL转自微软高校博客K_ECKEL'S MINDVIEW)
- 深度学习基础理论探索(一):激活函数、梯度消失
- 深度探索WM_PAINT消息
- 探索MFC笔记——消息映射
- 深度探索.Net Remoting基础架构
- 深度探索WM_PAINT消息
- MFC基础之消息映射
- VC-基础:VS2010/MFC-1MFC消息映射
- 深度学习word2vec笔记之基础篇算法篇应用篇--写的非常到位
- MFC消息映射与处理
- SkinUI入门教程(十一) SkinUI消息映射和消息处理
- 消息映射
- 深度学习概述<二>追本溯源:深度学习基础
- 深度解析VC中的消息
- 自定义消息如何手动添加消息映射?