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的雛形。