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

ATL布幔之下的秘密(5)

 2006-07-22 22:54:48 来源:WEB开发网   
核心提示: class ZWindow{public:HWND m_hWnd;ZWindow(HWND hWnd = 0) : m_hWnd(hWnd) { }inline void Attach(HWND hWnd){ m_hWnd = hWnd; }inline BOOL ShowWindow(i

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);
  }
};
你需要为WNDCLASS或WNDCLASSEX的一个域提供这个回调函数的地址。并且,你需要在创建ZWindow类对象之后像这样赋值: ZWindow zwnd;
WNDCLASS wnd;
wnd.lpfnWndProc = wnd.WndProc;
但是当你编译程序的时候,编译器会给出类似这样的错误: cannot convert from ''long (__stdcall ZWindow::*)(struct HWND__ *,
  unsigned int,unsigned int,long)'' to ''long (__stdcall *)(struct HWND__ *,
  unsigned int, unsigned int,long)
原因是你不能将成员函数作为回调函数来传递。为什么呢?因为在成员函数的情况下,编译器会自动传给成员函数一个参数,这个参数是指向这个类的指针,或者换句话说是this指针。所以这就意味着当你在成员函数中传递了n个参数的话,那么编译器会传递n+1个参数,并且那个附加的参数就是this指针。这条错误消息就表明编译器不能将成员函数转换为全局函数。

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

Tags:ATL 之下 秘密

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