WEB开发网
开发学院软件开发VC ATL布幔之下的秘密(5) 阅读

ATL布幔之下的秘密(5)

 2006-07-22 22:54:48 来源:WEB开发网   
核心提示: 那么,如果我们想将成员函数作为回调函数的话,ATL布幔之下的秘密(5)(4),应该怎么办呢?如果我们告诉编译器,不传递第一个this指针参数的话,它只是对Windows API的一层包装,唯一的优点就是你不需要传递HWND参数了,那么我们就可以将成员函数作为回调函数了,在C++中

那么,如果我们想将成员函数作为回调函数的话,应该怎么办呢?如果我们告诉编译器,不传递第一个this指针参数的话,那么我们就可以将成员函数作为回调函数了。在C++中,如果我们将成员函数声明为static的话,那么编译器就不会传递this指针了。这就是static和非static成员函数实质上的不同。

所以,我们可以把ZWindow类中的WndProc声明为static成员函数。这一技术也可以用在多线程的情况下,比如当你想要使用成员函数作为一个线程函数的时候,你就可以将一个static成员函数作为线程函数。

下面就是使用了ZWindow类的更新程序。

程序67. #include <windows.h>
class ZWindow
{
public:
  HWND m_hWnd;
  ZWindow(HWND hWnd = 0) : m_hWnd(hWnd) { }
  inline void Attach(HWND hWnd)
  { m_hWnd = hWnd; }
  inline BOOL ShowWindow(int nCmdShow)
  { return ::ShowWindow(m_hWnd, nCmdShow); }
  inline BOOL UpdateWindow()
  { return ::UpdateWindow(m_hWnd); }
  LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  {
    switch (uMsg)
    {
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    }
    return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, 
          int nCmdShow)
{
  char szAppName[] = "Hello world";
  HWND hWnd;
  MSG msg;
  WNDCLASS wnd;
  ZWindow zwnd;
  
  wnd.cbClsExtra  = NULL;
  wnd.cbWndExtra  = NULL;
  wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  wnd.hCursor    = LoadCursor(NULL, IDC_ARROW);
  wnd.hIcon     = LoadIcon(NULL, IDI_APPLICATION);
  wnd.hInstance   = hInstance;
  wnd.lpfnWndProc  = ZWindow::WndProc;
  wnd.lpszClassName = szAppName;
  wnd.lpszMenuName = NULL;
  wnd.style     = CS_HREDRAW | CS_VREDRAW;
  
  if (!RegisterClass(&wnd))
  {
    MessageBox(NULL, "Can not register window class", "Error",
          MB_OK | MB_ICONINFORMATION);
    return -1;
  }
  
  hWnd = CreateWindow(szAppName, "Hello world", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  zwnd.Attach(hWnd);
  
  zwnd.ShowWindow(nCmdShow);
  zwnd.UpdateWindow();
  while (GetMessage(&msg, NULL, 0, 0))
  {
    DispatchMessage(&msg);
  }
  
  return msg.wParam;
}
这个程序只是简单示范了一下ZWindow的用法,说实话,这个类就不会做什么特别的了。它只是对Windows API的一层包装,唯一的优点就是你不需要传递HWND参数了,但是你必须得在调用成员函数的时候输入对象的名称。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:ATL 之下 秘密

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接