由简入繁之三——一个窗口类
1.窗口类:把类的概念和WIN32窗口编程结合,要注意一下几点:
窗口处理函数必须是静态函数
消息映射机制,通过一个映射结构,将不同消息的处理过程映射到不同的处理函数
关键代码:
////////////////////////////////////////////////////////////////////////////////////////////////////////
知识点一:成员函数指针的用法在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数。比如:
class tt
{ public: void foo(int x){ printf("\n %d \n",x); }
};
typedef void ( tt::* FUNCTYPE)(int );
FUNCTYPE ptr = tt::foo; //给一个成员函数指针赋值.
tt a;
(a.*ptr)(5); //调用成员函数指针.
tt *b = new tt;
(b->*ptr)(6); //调用成员函数指针.
//声明消息处理结构
//消息处理函数
typedef LRESULT (CApp::*PFXN) (HWND, UINT, WPARAM, LPARAM);
//消息处理结构
struct MSGMAP_ENTRY
{
UINT nMessage;
PFXN pfn;
};
//定义消息处理结构
struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE, &(CApp::OnCreate),
WM_COMMAND, &(CApp::OnCommand),
WM_SIZE, &(CApp::OnSize),
WM_CLOSE, &(CApp::OnClose),
WM_DESTROY, &(CApp::OnDestroy),
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//主窗口处理函数
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
for (int i=0; i<dim(_messageEntries); i++)
{
if (uMsg == _messageEntries[i].nMessage)
{
return ( (app.*(_messageEntries[i].pfn)) (hWnd, uMsg, wParam, lParam) );
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
//
/*switch (uMsg)
{
case WM_CREATE:
break;
case WM_COMMAND:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}*/
}