ATL布幔之下的秘密(5)
2006-07-22 22:54:48 来源:WEB开发网对于以前,你这样调用函数: ShowWindow(hWnd, nCmdShow);
现在,你可以这么做: zwnd.ShowWindow(nCmdShow);
到现在为止,这并不是一个明显的优点。
我们来看看在WndProc中如何处理窗口消息。在前一个程序中,我们只处理了一个函数,也就是WM_DESTROY。如果你想要处理更多的消息,那么可以在switch语句中加入更多的case。让我们来修改一下WndProc,处理一下WM_PAINT。就像这个样子: switch (uMsg)
这个代码很正确,它会在窗口的正中显示Hello world。但是,为什么要用BeginPaint、GetClientRect和EndPaint这些API呢?根据我们的标准,这些API都应该作为ZWindow的成员函数来使用的——它们的第一个参数都是HWND。
{
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;
}
因为所有这些函数都是非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
所以,我们就可以使用和这里相同的技术,也就是将ZWindow对象的地址存入一个全局变量,然后利用这个指针调用非static成员函数。下面是前一个程序的更新版本,在其中我们没有直接调用窗口的API。
NonStaticFun
更多精彩
赞助商链接