1,Message Map雏形之实现
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);

LONGOnCreate(HWND,UINT,WPARAM,LPARAM);
LONGOnPaint(HWND,UINT,WPARAM,LPARAM);
LONGOnSize(HWND,UINT,WPARAM,LPARAM);
LONGOnCommand(HWND,UINT,WPARAM,LPARAM);
LONGOnSetFocus(HWND,UINT,WPARAM,LPARAM);
LONGOnClose(HWND,UINT,WPARAM,LPARAM);
LONGOnDestroy(HWND,UINT,WPARAM,LPARAM);
LONGOnAbout(HWND,UINT,WPARAM,LPARAM);
LONGOnExit(HWND,UINT,WPARAM,LPARAM);

struct
MSGMAP_ENTRY

{//消息映射表表项
UINTnMessage;
LONG(*pfn)(HWND,UINT,WPARAM,LPARAM);
}
;

MSGMAP_ENTRY_messageEntries[]
=

{
WM_CREATE,OnCreate,
WM_PAINT,OnPaint,
WM_SIZE,OnSize,
WM_COMMAND,OnCommand,
WM_SETFOCUS,OnSetFocus,
WM_CLOSE,OnClose,
WM_DESTROY,OnDestroy
}
;
MSGMAP_ENTRY_commandEntries[]
=

{
IDM_ABOUT,OnAbout,
IDM_EXIT,OnExit
}
;

LONGOnCreate(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
return0;
}
LONGOnPaint(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
PAINTSTRUCTps;
HDChdc;
hdc=BeginPaint(hWnd,&ps);
::TextOut(hdc,10,10,_T("hello"),5);
EndPaint(hWnd,&ps);
return0;
}
LONGOnSize(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
return0;
}
LONGOnCommand(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{//处理command
inti,wmId,wmEvent;
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
intnumEntries=sizeof(_commandEntries)/sizeof(_commandEntries[0]);//命令映射表表项数目
for(i=0;i<numEntries;++i)


{
if(_commandEntries[i].nMessage==wmId)


{//命令匹配
return(*_commandEntries[i].pfn)(hWnd,nMessage,wParam,lParam);//调用处理函数
}
}
if(i==numEntries)


{
returnDefWindowProc(hWnd,nMessage,wParam,lParam);
}
return0;
}
LONGOnSetFocus(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
return0;
}
LONGOnClose(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
DestroyWindow(hWnd);
return0;
}
LONGOnDestroy(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
PostQuitMessage(0);
return0;
}
LONGOnAbout(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);
return0;
}
LONGOnExit(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
DestroyWindow(hWnd);
return0;
}

int
APIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,
int
nCmdShow)

{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//TODO:在此放置代码。
MSGmsg;
HACCELhAccelTable;
//初始化全局字符串
LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadString(hInstance,IDC_CH_1,szWindowClass,MAX_LOADSTRING);
MyRegisterClass(hInstance);
//执行应用程序初始化:
if(!InitInstance(hInstance,nCmdShow))


{
returnFALSE;
}
hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_CH_1));
//主消息循环:
while(GetMessage(&msg,NULL,0,0))


{
if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))


{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(int)msg.wParam;
}

LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)

{
inti;
intnumEntries=sizeof(_messageEntries)/sizeof(_messageEntries[0]);//消息映射表表项数目
for(i=0;i<numEntries;++i)


{
if(_messageEntries[i].nMessage==message)


{//消息匹配
return(*_messageEntries[i].pfn)(hWnd,message,wParam,lParam);//调用处理函数
}
}
if(i==numEntries)


{
returnDefWindowProc(hWnd,message,wParam,lParam);
}
return0;
}

//
“关于”框的消息处理程序。
INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)

{
UNREFERENCED_PARAMETER(lParam);
switch(message)


{
caseWM_INITDIALOG:
return(INT_PTR)TRUE;
caseWM_COMMAND:
if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL)


{
EndDialog(hDlg,LOWORD(wParam));
return(INT_PTR)TRUE;
}
break;
}
return(INT_PTR)FALSE;
}

2,空闲时间的处理
while
(TRUE)

{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))


{
if(msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else


{
OnIdle();
}
}
3, PostMessage的使用
LONGOnDestroy(HWNDhWnd,UINTnMessage,WPARAMwParam,LPARAMlParam)

{
::PostMessage(hWnd,WM_QUIT,NULL,NULL);
return0;
}