MFC消息映射雏形 1.MSGMAP_ENTRY结构与dim(x)宏 MSGMAP_ENTRY{ UINT nMessage; LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);}; #define dim(x) (sizeof(x) / sizeof(x[0])) 其中,pfn是函数指针,此函数用来处理nMessage消息。 2.组织两个数组, _messageEntries[] 和 _commandEntries[],把欲处理的消息及消息处理函数的关联性建立起来: //消息与处理例程的对照表格struct MSGMAP_ENTRY _messageEntries[] ={ WM_CREATE, OnCreate, WM_PAINT, OnPaint, WM_SIZE, OnSize, WM_COMMAND, OnCommand, WM_SETFOCUS, OnSetFocus, ...} //Command-ID与处理例程的对照表格struct MSGMAP_ENTRY _commandEntries[] ={ IDM_ABOUT, OnAbout, WM_PAINT, OnPaint, WM_SIZE, OnSize, WM_COMMAND, OnCommand, WM_SETFOCUS, OnSetFocus, ...} 于是窗口映射函数可以这样设计: //窗口函数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 处理函数LONG OnCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ int i; for(i=0; i<dim(_commandEntries); i++){ //COMMAND对照表 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 message, WPARAM wParam, LPARAM lParam){ ...}

评论