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;
}
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();
}
}
{
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;
}
{
::PostMessage(hWnd,WM_QUIT,NULL,NULL);
return0;
}