WEB开发网
开发学院软件开发VC ATL的GUI程序设计(4)ATL的窗口类 阅读

ATL的GUI程序设计(4)ATL的窗口类

 2006-04-11 22:54:24 来源:WEB开发网   
核心提示: ATL窗口类的活版封装MFC的CWnd是一个冗长得有些过分的类,究其原因,ATL的GUI程序设计(4)ATL的窗口类(2),窗口类的封装理念决定了窗口类的消息分流,而消息分流则决定了类的代码篇幅,CWindowImplRoot继承自TBase和CMessageMap,T参数即是你所继承下来

ATL窗口类的活版封装

MFC的CWnd是一个冗长得有些过分的类。究其原因,窗口类的封装理念决定了窗口类的消息分流,而消息分流则决定了类的代码篇幅。如果你已经打开了afxwin.h文件,就可以发现CWnd花了很大的篇幅在“On”开头的事件响应函数上。其实在我们进行Win32程序设计的时候,真正感兴趣的事件没有几个,所以说“万能”势必造就冗长。

另外,考虑MFC的诞生年代,所以对于窗口的封装只是采用了C++的低端特性——例如薄层的封装和单向继承。(题外话:而且MFC中还存在着一些诸如CString、CArray、CList之类的工具,盖因其时STL还未标准化之故。)随着MFC的发展,任凭它做出任何优化,也无法避免当初架构理念带来的效率阴影和偏差。

ATL的诞生年代晚于MFC,使之能够有机会使用C++的高端特性,也就是模板和多重继承。于是,它使用了一种全新的封装理念:将属性、方法、事件分别独立出来,然后利用模板和多重继承的特性将这三者根据需要而组合在一起——打个比方来说,如果MFC的窗口封装是雕版印刷术,那么ATL的窗口封装就是活版印刷术。以上一章的CHelloATLWnd类为例,它的继承层次如下图:

这是一个稍显冗长的继承链,不过我并不打算对它进行详细的解说。在此,我只请你看这个继承层次的最底层和最上层。从最底层来看,CHelloATLWnd继承自CWindowImpl,CWindowImpl有三个模板参数:T、TBase、TWinTraits。再看最上层,CWindowImplRoot继承自TBase和CMessageMap。T参数即是你所继承下来的子类名,通常用于编译期的虚函数机制(后边我会对这一机制进行介绍);TBase参数为对窗口方法和句柄的封装;TWinTraits是窗口样式的类封装;CMessageMap是对窗口事件响应的封装。

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

Tags:ATL GUI 程序设计

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