1. Message Map
1) 建立消息结构
struct MSGMAP_ENTRY{
UINT nMessage;
LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);
};
#define dim(x) (sizeof(x) / sizeof(x[0]))
注意:pfn是一个函数指针;
在这里我们把数据和处理数据的方法封装到一起;
2) 建立消息影射数组
// 消息与处理例程的对照表格
struct MSGMAP_ENTRY _messageEntries[] = {
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
.......
};
// Command-ID与处理例程对照表格
struct MSGMAPENTRY _commandEntries[] = {
IDM_ABOUT, OnAbout,
IDM_SAVES, OnSaves,
......
}
// 窗口函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
for(int i = 0;i<dim(_messageEntries);i++)
{
if(LOWORD(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)
{
for(int i = 0;i<dim(_commandEntries);i++)
{
if(LOWORD(message) == _commandEntries[i].nMessage)
return (*_command[i].pfn)(hWnd, message, wParam, lParam);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
LONG OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
}
... ...
这么一来WndProc和OnCommand永远不必改变,每当有新的要处理的消息时,只要在_messageEntries和_commandEntries两个数组中加上新的元素,并针对新的消息添加消息处理例程即可。
这种观念及做法就是MFC中Message Map的雏形。