ATL的GUI程序设计(4)ATL的窗口类
2006-04-11 22:54:24 来源:WEB开发网核心提示: 这里已经为要注册的窗口类设置好了绝大多数的常用属性,当然,ATL的GUI程序设计(4)ATL的窗口类(8),如果你仍然觉得自己需要更改更多的属性的话,可以像CHelloATLWnd的构造函数里那么做,ATL就是借助这样的机制来保证效率的,如果你深入到atlwin.h的源代码之中,特别要指出
这里已经为要注册的窗口类设置好了绝大多数的常用属性,当然,如果你仍然觉得自己需要更改更多的属性的话,可以像CHelloATLWnd的构造函数里那么做。特别要指出的一点是,ATL对窗口类的光标(cursor)属性是进行特殊处理的,对CWndClassInfo::m_wc.hCursor直接赋值是不行的。
编译期的虚函数机制
ATL的效率远远高于MFC,其中一方面的原因就是它把很多的工作都通过模板来交给编译器了,比如我上文提到的编译期的虚函数机制。这个机制可以避免虚函数带来的一切开销而静态实现虚函数的特性。考虑以下代码:
template < typename T >
class Parent
{
public:
void f()
{
cout << "f from Parent." << endl;
}
void g()
{
T* pT = (T*)this;
pT->f();
}
};
class Child1 : public Parent< Child1 >
{
public:
void f()
{
cout << "f from Child1." << endl;
}
};
class Child2 : public Parent< Child2 >
{
};
然后,这样进行调用:
Child1 c1;
Child2 c2;
c1.g(); // f from Child1.
c2.g(); // f from Parent.
所有的奥秘尽在Parent::g之中,它通过一个类型转换在编译期就决定了调用哪个函数,颇有些多态性的味道。ATL就是借助这样的机制来保证效率的,如果你深入到atlwin.h的源代码之中,肯定会发现更多诸如此类的例子。
更多精彩
赞助商链接