ATL窗口,第一部分
源程序
--------------------------------------------------------------------------------
这篇文章由Andrew Whitechapel所写,由孙凯翻译。
绪论
ATL窗口类并不难学,但其与MFC非常不同,很多开发者便说我喜欢丰富的MFC支持,为什么要花心思学ATL窗口呢?唔,MFC有着很大的尺寸和高的性能消费,强迫你用那套应用程序框架体系工作 -- 这些天你又怀疑文档是否继续有效 - 基于文档模板的连载机制。使用ATL窗口的一个大大的优点,当然是非常容易整合COM支持。如果你想更快的、轻量级的窗口和自由选择你的应用程序体系和持续协议的灵活性,你不能不选择ATL。
在这篇文章中,我会提供ATL窗口类介绍和一个简单的基于ATL框架/视图应用程序的食谱指南 -- 你会看到居然可以十分容易的实现象MFC一样的前端功能。ATL窗口的学习曲线比起MFC来更短更平滑,因为ATL更小。
虽然ATL最初是为支持COM而设计的,它也包含了一系列用于构建窗口的类。你可以用这些类构建有窗口的COM对象,如ActiveX控制,创建Windows应用程序时却可以不必包含COM。最重要的ATL窗口类列于下表中:
CWindow 一个小的包装了用于操作窗口的Win32 API的类,包含一个窗口句柄和一个将CWindow对象转换为HWND的HWND操作符。因而你可以将一个CWindow对象传递给任何一个需要窗口句柄参数的函数。
CWindowImpl 你可以用CWindowImpl创建基于一个新的窗口类的、已存在的类的超类或子类的一个窗口。
CContainedWindow 一个实现了发送消息到其它类的消息映射的窗口,允许你把消息处理集中到一个类中的类。
CAxWindow 允许你实现一个可包含ActiveX控制的窗口,它有一些创建控制或绑定一个存在的控制的函数。
CDialogImpl 用于实现一个模态或非模态的对话框的基类。CDialogImpl提供一个包含发送消息到你的派生类的默认消息映射的对话框过程。但它不支持ActiveX控制。
CSimpleDialog 依靠对话框资源ID实现模态对话框。CSimpleDialog有一个预先确定的能够处理IDOK和IDCANCEL命令的消息映射。
CAxDialogImpl 和CDialogImpl一样,也用于实现一个模态或非模态的对话框的基类。同样提供一个包含发送消息到你的派生类的默认消息映射的对话框过程。且它支持ActiveX控制。ATL Object Wizard支持向你的工程添加一个CAxDialogImpl的派生类,并产生相关的对话框资源。
CWndClassInfo 管理一个新的窗口类(Windows的WNDCLASS)的信息 -- 其实就是封装了WNDCLASSEX。
CWinTraits和CWinTraintsOR 封装了一个ATL窗口对象的窗口特征(WS_ 窗口风格)。
消息映射
人们不愿花时间学习ATL窗口类的一个主要原因是觉得ATL的消息映射机制有些奇怪。是的,它与MFC的不同,但是在你第一次看到MFC消息映射宏时,你是否理解它呢?事实上,ATL消息映射机制是非常容易掌握的。允许你在CWindowImpl的派生类中处理窗口消息,因为ATL类继承自一个抽象的基类CMessageMap。CMessageMap声明了一个纯虚函数ProcessWindowMessage,它是通过宏BEGIN_MSG_MAP和END_MSG_MAP在你的CWindowImpl派生类中实现。
另外,与MFC的消息处理很相似,ATL的消息处理函数只是多一个BOOL&的变量(译者说明:在ATL源代码中,ProcessWindowMessage函数定义了变量BOOL bHandled = TRUE,这里即指它)。这是变量指出一个消息是否被处理,它默认为TRUE。一个消息处理函数可以将这个变量设置为FALSE,以指示消息未被处理。在这种情况下,ATL会进入消息映射中更深一层的消息处理函数。通过将这个变量设置为FALSE,你可以首先执行一些操作以响应消息,然后允许默认处理或另外的处理函数完成消息响应。
下表中列出了三组消息映射宏:
.所有消息的消息处理者






