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

ATL布幔之下的秘密(5)

 2006-07-22 22:54:48 来源:WEB开发网   
核心提示: 对于以前,你这样调用函数: ShowWindow(hWnd, nCmdShow);现在,ATL布幔之下的秘密(5)(5),你可以这么做: zwnd.ShowWindow(nCmdShow);到现在为止,这并不是一个明显的优点,然后利用这个指针调用非static成员函数,下面是前一个程序的更

对于以前,你这样调用函数: ShowWindow(hWnd, nCmdShow);现在,你可以这么做: zwnd.ShowWindow(nCmdShow);到现在为止,这并不是一个明显的优点。

我们来看看在WndProc中如何处理窗口消息。在前一个程序中,我们只处理了一个函数,也就是WM_DESTROY。如果你想要处理更多的消息,那么可以在switch语句中加入更多的case。让我们来修改一下WndProc,处理一下WM_PAINT。就像这个样子: switch (uMsg)
{
case WM_PAINT:
  hDC = ::BeginPaint(hWnd, &ps);
  ::GetClientRect(hWnd, &rect);
  ::DrawText(hDC, "Hello world", -1, &rect, DT_CENTER | DT_VCENTER DT_SINGLELINE);
  ::EndPaint(hWnd, &ps);
  break;
case WM_DESTROY:
  ::PostQuitMessage(0);
  break;
}
这个代码很正确,它会在窗口的正中显示Hello world。但是,为什么要用BeginPaint、GetClientRect和EndPaint这些API呢?根据我们的标准,这些API都应该作为ZWindow的成员函数来使用的——它们的第一个参数都是HWND。

因为所有这些函数都是非static函数。并且,你不能在static成员函数中调用非static成员函数。为什么呢?因为它们的区别就是this指针,非static成员函数拥有this指针,而static函数没有。如果我们通过某种手段将this指针传递给了static成员函数,那么我们就可以在static成员函数中调用非static成员函数了。让我们看看下面的程序。

程序68. #include <iostream>
using namespace std;
class C
{
public:
  void NonStaticFunc()
  {  
    cout << "NonStaticFun" << endl;
  }
  static void StaticFun(C* pC)
  {
    cout << "StaticFun" << endl;
    pC->NonStaticFunc();
  }
};
int main()
{
  C objC;
  C::StaticFun(&objC);
  return 0;
}
程序的输出为: StaticFun
NonStaticFun
所以,我们就可以使用和这里相同的技术,也就是将ZWindow对象的地址存入一个全局变量,然后利用这个指针调用非static成员函数。下面是前一个程序的更新版本,在其中我们没有直接调用窗口的API。

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

Tags:ATL 之下 秘密

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