我一直在寻找这样一个类库:他对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能实现的各种稀奇古怪的效果都实现了,但都是着眼于局部问题得解决,缺乏系统地全面地介绍WTL的文章。就在这个时候我看到了迈克尔.敦(Michael Dunn)的“WTL for MFC Programmers”系列文章,我的感觉和1995年我第一次见到MSDN时一样,几乎是迫不及待地将其读完,同时也萌发了将其翻译成汉语的冲动。于是给Michael写了封邮件,希望能够得到授权将他的文章翻译成汉语(事实上在这之前我已经翻译了两章了)。在得到授权确认后才发现这个工作是多么的困难,但为时已晚,只能硬着头皮撑下去。
另外需要说明得是我翻译“WTL for MFC Programmers”系列文章不是为了获得任何利益,只是想为大家提供一些新的思路。如果你是MFC的坚定捍卫者,看到这里你就可以停下来了,再看下去是浪费你的时间(希望你看了前面几段文字还能挺住不要呕吐)。如果你是个对另类事物充满热情的程序员,你不能不研究WTL,它真的是一座宝藏。
最后用我的朋友对我的翻译文章的评价来结束“WTL for MFC Programmers”中文版的序言:翻译水平和你用的鼠标一样烂!
这里有详细的关于WTL的教程