

序言
第一章 界面类
、对本书的总体介绍
、对这一章的简单介绍
、背景知识 和 的发展历史
、 风格模板
、窗口类
、定义一个窗口的实现
、填写消息映射链
、高级消息映射链和嵌入类
、 程序的结构
、 中的对话框
第二章 界面基类
、总体印象
、开始写 程序
、对消息映射的增强
、从 的应用程序生成向导能得到什么
第三章 工具条与状态条
、主窗口的工具条和状态条
第四章 对话框与控件
第五章 高级对话框用户界面类
第六章 包容 控件
第七章 分隔窗口
第八章 属性页与向导
第九章 类,通用对话框,初始化类
、封装类
、封装类的通用函数
、与 封装类的不同之处
、资源装载( !"#$%&')函数
、使用通用对话框
、%(%#(' 类 )
、($!%#(' 类
、其它有用的类和全局函数
、对结构的封装
、处理双类型参数的类
、其它工具类
)、全局函数
、宏
、例子工程 )
第十章 支持拖放操作

序言
我一直在寻找这样一个类库:他对 Windows 的窗口提供面向对象的封装,有灵活的消息响应机
制和比较完备的界面框架解决方案,对标准控件提供简练实用的封装,支持操作系统的新特性,支
持功能扩充和二次开发,有代码自动生成向导机制,生成的程序使用较少的系统资源,最后是有完
全的代码支持和文档支持。
你会说那就用 MFC 吧!
是的,我一直使用 MFC,但我对 MFC 已经越来越厌倦了。陈旧的类库使得它无法支持操作系
统的新特性(MFC 的类库从 4.21 版之后就没有更新了,而那时是 1998 年,人们使用 Windows 95 和
windows NT4),臃肿的消息映射机制和为了兼容性而保留下来的代码使得程序效率低下,面面俱到
的框架结构使得生成的应用程序庞大并占用过多的系统资源。当一个功能简单的程序使用动态链接
也超过 200K,占用 3%-4%的系统资源时,我决定放弃 MFC,寻找一个新的功能类似的类库。我研
究过很多类似的代码,不是过于简单,无法用于应用程序的开发,就是缺乏代码和文档的支持。在
CodeProject 上有一个名为 Class 的类库,我也研究过它的代码,具备了基本的界面框架,对控件也
有了简单的封装,但是不实用,庞大的虚函数机制使得对象非常臃肿,无法减少对资源的占用。我
甚至仿照 MFC 做了一个简单的类库 miniGUI,形成了基本的框架解决方案,但是最后放弃了,原因
很简单:无法用于应用程序的开发。一个应用程序界面框架错综复杂,要考虑的事情太多,开发者
不可能在应用程序和界面框架两线作战。就在我即将绝望的时候,我遇到了 WTL。
由于工作的需要经常开发一些 COM 组件,在要求不能使用 MFC 的场合就是用 ATL。ATL 提
供了对窗口的面向对象地封装和简单的消息映射机制,但是 ATL 过于简单,用它开发应用程序几乎
不可能。要想让 ATL 具备界面框架解决方案的功能还需要做很多事情,幸运的是 WTL 就做了这些
事情。WTL 是个很奇特的东西,它由微软公司一群热情的程序员维护,它从未出现在微软的官方产
品名单上,但可以从微软的官方网站下载最新的 WTL。它没有正式的文档支持,用 WTL 做关键字
在 MSDN 中检索只能得到 0 个结果,但是全世界的开发网站上都有针对 WTL 的讨论组和邮件列表,
任何问题都会得到热情的解答。我认真地对比了 MFC 和 WTL,发现二者有很多相通之处,MFC 的
功能几乎都能在 WTL 中实现,只是方法不同而已。我几乎不费吹灰之力就将以前写的一个 MFC 程
序用 WTL 改写了,使用静态链接的 WTL 程序比使用动态链接的 MFC 程序还要小,资源占用只有
MFC 程序的一半。
但是一时的热情不能解决文档缺乏的困扰,虽然网上有很多使用 WTL 的例子和说明文章,几
乎把 MFC 能实现的各种稀奇古怪的效果都实现了。就在这个时候我看到了迈克尔.敦 (Michael Dunn)
的“WTL for MFC Programmers”系列文章,我的感觉和 1995 年我第一次见到 MSDN 时一样,几乎是
迫不及待地将其读完,同时也萌发了将其翻译成汉语的冲动。于是给 Michael 写了封邮件,希望能
够得到授权将他的文章翻译成汉语(事实上在这之前我已经翻译了两章了)。在得到授权确认后才发
现这个工作是多么的困难,但为时已晚,只能硬着头皮撑下去。

第一章 ATL 界面类
你需要开发平台 SDK。你要使用 WTL 不能没有它,你可以使用在线升级安装开发平台 SDK,
也可以下载全部文件后在本地安装。在使用之前要将 SDK 的包含文件(.h 头 文件)和库文件(.Lib
文件)路径添加到 VC 的搜索目录,SDK 有现成的工具完成这个工作,这个工具位于开发平台 SDK
程序组的“Visual Studio Registration”文件夹里(这是针对 VC++6.0 的)。
你需要安装 WTL。你可以从微软的网站上下载 WTL 的 8.0 版,在安装之前可以先查看“Intro
duction to WTL - Part 1”和“Easy installation of WTL”这两篇文章,了解一下所要安装的文件的信息,
虽然现在这些文章有些过时,但还是可以提供很多有用的信息。有一件我认为不该在本篇文章中提
到的事是告诉 VC 如何搜索 WTL 的包含文件路径,如果你用的 VC6,用鼠标点击 Tools\Options,转
到 Directories 标签页,在显示路径的列表框中选择 Include Files,然后将 WTL 的包含文件的存放路
径添加到包含文件搜索路径列表中。
你需要了解 MFC。很好地了解 MFC 将有助于你理解后面提到的有关消息映射的宏并能够编辑
那些标有“不要编辑(DO NOT EDIT)”的代码而不会出现问题。
你需要清楚地知道如何使用 Win32 API 编程。如果你是直接从 MFC 开始学习 Windows 编程,
没有学过 API 级别的消息处理方式,那很不幸你会在使用 WTL 时遇到麻烦。如果不了解 Windows
消息中 WPARAM 参数和 LPARAM 参数的意义,则需要读一些这方面的文章(在 CodeProject 有大
量的此类文章)。
你需要知道 C++ 模板的语法,你可以到 VC Forum FAQ 相关的连接寻求答案。
我只是讨论了一些涵盖 VC 6 的特点,不过据我了解所有的程序都可以在 VC 7 上使用。由于我不
使用 VC 7,我无法对那些在 VC 7 中出现的问题提供帮助,不过你还是可以放心的在此张贴你的问
题,因为其他的人可能会帮助你。
1.1、对本书的总体介绍
WTL 具有两面性,确实是这样的。虽然它没有 MFC 的界面类库那样强大的功能,但是能够生
成很小的应用程序。如果你象我一样使用 MFC 进行界面编程,你会觉得 MFC 提供的界面控件封装
类使用起来非常舒服,更不用说 MFC 内置的消息处理机制。当然,如果你也象我一样不希望自己
的程序仅仅因为使用了 MFC 的框架就增加几百 K 的大小的话,WTL 就是你的选择。当然,我们还
要克服一些障碍:
1> ATL 样式的模板类初看起来有点怪异 ;
2> 没有类向导的支持,所以要手工处理所有的消息映射(名叫 VisualFC 的第三方插件可以提
供相应向导);

3> MSDN 没有正式的文档支持,你需要到处去收集有关的文档,甚至是查看 WTL 的源代码;
4> 买不到参考书籍;
5> 没有微软的官方支持;
6> ATL/WTL 的窗口与 MFC 的窗口有很大的不同,你所了解的有关 MFC 的知识并不完全适用
于 WTL。
从另一方面来讲,WTL 也有它自身的优势:
1> 不需要学习或掌握复杂的文档/视图框架;
2> 具有 MFC 的基本的界面特色,比如 DDX/DDV 和命令状态 UI 更新功能(比如菜单的 Check
标记和 Enable 标记等);
3> 增强了一些 MFC 的特性(比如更加易用的分隔窗口);
4> 可生成比静态链接的 MFC 程序更小的应用程序(WTL 的所有源代码都是静态链接到你的程
序中的,除了 CRT 之类);
5> 你可以修正自己使用的 WTL 中的 BUG,而不会影响其他的应用程序(相比之下,如果你修正
了有 BUG 的 MFC/CRT 动态库就可能会引起其它应用程序的崩溃;
6> 如果你仍然需要使用 MFC,MFC 的窗口和 ATL/WTL 的窗口可以“和平共处”。
在本文中,我将首先介绍 ATL 的窗口类,毕竟 WTL 是构建于 ATL 之上的,并附加了一系列类,
所以需要很好地了解 ATL 的窗口类。介绍完 ATL 之后我将介绍 WTL 的特性,并展示它是如何使界
面编程变得轻而易举。
1.2、对这一章的简单介绍
WTL 是个很酷的工具,在理解这一点之前需要首先介绍 ATL。WTL 是构建与 ATL 之上的,并
附加了一系列类。如果你是个使用 MFC 的程序员,你可能没有机会接触到 ATL 的界面类,所以请
容忍我在开始 WTL 之前先罗索一些别的东西,绕道来介绍一下 ATL 是很有必要地。
在本文的第一部分,我将给出一点 ATL 的背景知识,包括一些编写 ATL 代码所必须知道的基
础知识,快速地解释一些令人不知所措的 ATL 模板类和基本的 ATL 窗口类。
1.2.1、ATL 背景知识 ATL 和 WTL 的发展历史
ATL “活动模板库”是一个很古怪的名字。那些年纪大的人可能还记得,它最初被称为“网络组件
模板库”,这可能是它更准确的称呼,因为 ATL 的目的就是使编写组件对象和 ActiveX 控件更容易
一些(ATL 是在微软开发新产品 ActiveX-某某的过程中开发的,那些 ActiveX-某某现在被称为某某.
NET)。由于 ATL 只是为了便于编写组件对象而存在的,所以仅提供了简单的界面类,相当于
MFC 的窗口类(CWnd)和对话框类(CDialog)。 幸运地是,这些类非常的灵活,能够在其基础
上构建象 WTL 这样的附加类。