由简入繁之三——一个窗口类

实例下载

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;
 }*/
}

posted on 2011-05-09 15:29  袁婉轩  阅读(4593)  评论(0编辑  收藏  举报

导航