《深入浅出MFC》——消息映射(Message Map)的雏形
来源:互联网 发布:新开的超市怎录入数据 编辑:程序博客网 时间:2024/06/06 21:57
以下做法是MFC「消息映射表格」的雏形,我所采用的结构名称和变量名称,都与MFC相同。
首先,定义一个MSGMAP_ENTRY接受个一个dim宏:
struct MSGMAP_ENTRY{
UINT nMessage;
LONG (*pfn) (HWND, UINT, WPARAM, LPARAM);
};
#define dim( x ) ( sizeof ( x ) / sizeof ( x [ 0 ] ) )
请注意MSGMAP_ENTRY的第二个元素pfn是一个函数指针,我准备以此指针所指的函数处理nMessage消息。这正是对象导向观念中把「资料」和「处理资料的方法」封装起来的一种具体实现,只不过我们用的不是C++语言。
接下来,组织两个数组_messageEntries[ ]和_commandEntries[ ],把程序中欲处理的消息以及消息处理例程的关联性建立起来:
// 消息与处理例程之对照表
struct MSGMAP_ENTRY _messageEntries [ ]=
{
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy,
}; ↑ ↑
这是消息 这是消息处理例程
//Command - ID与处理例程之对照表
struct MSGMAP_ENTRY _commandEntries [ ]=
{
IDM_ABOUT, OnAbout,
IDM_FILEOPEN, OnFileOpen,
IDM_SAVEAS, OnSaveAs,
}; ↑ ↑
这是WM_COMMAND命令项 这是命令处理例程
于是窗口函数可以这么设计:
//---------------------------------------------------------------------------------------------------------
//窗口函数
//---------------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for ( i = 0; i < dim(_messageEntries); i++) { //消息对照表
if (message == _messageEntries [ i ] .nMessage)
return ( (*_messageEntries [ i ] .pfn) (hWnd, message, wParam, lParam) );
}
return ( DefWindowProc (hWnd, message, wParam, lParam) );
}
//---------------------------------------------------------------------------------------------------------
//OnCommand --专门处理WM_COMMAND
//---------------------------------------------------------------------------------------------------------
LONG OnCommand(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam)
{
int i;
for ( i = 0; i < dim(_commandEntries); i++) { //命令项目对照表
if (LOWORD (wParam) == _commandEntries[ i ] .nMessage)
return ( (*_commandEntries[ i ] .pfn) (hWnd, message, wParam ,lParam) );
}
return ( DefWindowProc (hWnd, message, wParam, lParam) );
}
//---------------------------------------------------------------------------------------------------------
LONG OnCreate (HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}
//---------------------------------------------------------------------------------------------------------
LONG OnAbout (HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}
//---------------------------------------------------------------------------------------------------------
这么一来,WndProc和OnCommand永远不必改变,每有新药处理的消息,只要在_messageEntries[ ]和_commandEntries[ ]两个数组中加上新元素,并针对新消息撰写新的处理例程即可。这种观念以及做法就是MFC的Message Map的雏形。MFC把其中的动作包装得更好更精致(当然因此也就更复杂得多),成为一张庞大的消息地图;程序一旦获得消息,就可以按图上溯,知道被处理为止。
摘自《深入浅出MFC》
- 《深入浅出MFC》——消息映射(Message Map)的雏形
- Window消息映射(Message Map)的雏形
- 深入浅出MFC Message Mapping 消息映射
- MFC深入浅出--消息映射
- MFC深入浅出--消息映射
- MFC深入浅出之消息映射
- MFC深入浅出之四消息映射的实现-李进久
- Message Map 消息映射(转)
- Q001[Window消息映射的雏形]
- MFC学习笔记五——消息映射(Message Mapping)
- MFC中的消息映射(Message Mapping)
- 深入浅出MFC---Frame7(消息映射)
- MFC 消息映射 消息传递MESSAGE_MAP 读深入浅出MFC感悟
- MFC消息雏形
- MFC的消息映射
- MFC的消息映射
- MFC的消息映射
- MFC的消息映射
- 邻接矩阵构造图
- 微软公司面试题
- 树状数组区间求和三种模型
- java注解 1
- Apusic AS下如何正确设置solr
- 《深入浅出MFC》——消息映射(Message Map)的雏形
- 侵入,无侵入? Annotation vs Interface
- 千里之行,始于足下——我的第一篇blog
- Hibernate
- 软件工程的特点
- 普利姆算法通俗讲解
- Code Optimization Using the GNU C Compiler
- 关于AVR I/O 的驱动能力的介绍
- 利用fedora 15 DVD ISO 镜像制作安装源