[转贴]MFC程序员的WTL指南: 中文版序言

本文是MFC程序员的WTL指南中文版序言。作者因MFC陈旧、效率低、占用资源多而寻找新类库,最终遇到WTL。WTL由微软程序员维护,虽无官方文档,但网上讨论多。作者对比发现WTL与MFC功能相通,改写程序后资源占用减半。作者翻译相关文章,为大家提供新思路。

MFC程序员的WTL指南: 中文版序言

作者:Orbit (www.winmsg.com)


我一直在寻找这样一个类库:他对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能实现的各种稀奇古怪的效果都实现了,但都是叛塾诰植课侍獾媒饩觯狈ο低车厝娴亟樯躓TL的文章。就在这个时候我看到了迈克尔.敦(Michael Dunn)的“WTL for MFC Programmers”系列文章,我的感觉和1995年我第一次见到MSDN时一样,几乎是迫不及待地将其读完,同时也萌发了将其翻译成汉语的冲动。于是给Michael写了封邮件,希望能够得到授权将他的文章翻译成汉语(事实上在这之前我已经翻译了两章了)。在得到授权确认后才发现这个工作是多么的困难,但为时已晚,只能硬着头皮撑下去。
现在介绍一下迈克尔.敦这个人。迈克(Mike)住在阳光灿烂的洛杉矶,深受那里天气的宠爱使他愿意一直住在那里。他在4年级时就开始在Apple //e上编程序,1995年从UCLA (加利福尼亚大学洛杉矶分校)毕业,获得数学学士学位。毕业后加盟赛门铁克(Symantec)公司,成为Norton AntiVirus小组的质量评价工程师。他几乎是自学了Windows和MFC编程,1999年他为Norton AntiVirus 2000设计并编写了新的界面。迈克现在是pressplay(不久成为Napster) 的开发人员。他最近开发了一个IE的工具条插件UltraBar ,可以轻松实现繁琐的网络搜索功能。他还和别人合作创办了一家软件开发公司:Zabersoft ,该公司在洛杉矶和欧登赛(丹麦)都设有办事处。迈克喜欢玩弹球和骑自行车,偶尔也玩一下PlayStation,他还一直坚持学习法语,官方汉语和日语。
另外需要说明得是我翻译“WTL for MFC Programmers”系列文章不是为了获得任何利益,只是想为大家提供一些新的思路。如果你是MFC的坚定捍卫者,看到这里你就可以停下来了,再看下去是浪费你的时间(希望你看了前面几段文字还能挺住不要呕吐)。如果你是个对另类事物充满热情的程序员,你不能不研究WTL,它真的是一座宝藏最后用我的朋友对我的翻译文章的评价来结束“WTL for MFC Programmers”中文版的序言:翻译水平和你用的鼠标一样烂!

Orbit (inte2000@263.net)
2003年8月17日

WTL 在开发者之间的悄悄传播已经超过一年了, 传闻它是基于ATL的,并在微软内部使用.这理所当然的引起了ATL开发者社区的注意.这些人从ATL1.1开始,就一直为ATL控件书写UI代码,但是他们发现,他们的所写的代码常常就是纯的Win32 GDI代码.我告诉您, WTL并没有多大不同.是不是让人失望? 不,因为ATL只是对COM进行了简单的封装,这也是ATL的强大之处. 是的,写ATL您必须通晓COM. 您在ATL上额外花费的功夫跟您学习COM所作的努力比起来,简直微不足道.这跟那些需要把主要精力花费在学习类库本身,忽略COM的库是完全不同的.WTL与此类似.您需要懂得Win32窗口技术和GDI.只要您懂得,学习WTL就似清风抚面,再简单不过了.如果您不懂 这些,那么您最好使用VB来写UI代码. 它给各种类型的应用程序提供了一个基本的框架.注意,虽然您没有MFC那样的文档/视结构,但是您有视(views). 在WTL有大量的代码让您来管理视,而且加入您自己的代码也很容易. WTL有AppWizard,可以让您生成SDI, MDI 和多线程SDI程序多线程SDI跟IE或Windows Explorer很像.它看起来是打开了多个程序实例,实际上这些窗口都是属于一个进程的.另外,您的程序可以是基于对话框的,也可以是基于视的.视可以是基于CWindowImpl的,也可以是基于控件,甚至是IE里的一个HTML页.您可以选择您的程序是否需要一个rebar, command bar (CE-like), toolbar 和/或status bar.另外,您的程序可以主持ActiveX控件,以及成为一个COM服务器. 这里有几个关于视的选项. WTL提供splitter窗口类(这样在一个视里您可以有两个窗口)和scroll窗口类(这样您的窗口可以比它显示的"视"小). WTL也有个类似MFC的UpDateUI的东西,但是它们不是很一样 - 主要的区别是您需要把需要更新的项用宏映射标注出来,然后您在您的类里加入执行UpdateUI的代码. DDX/DDV在WTL也支持,同样类似MFC,但有不同. 您必须加一个宏映射来实现DoDataExchange,然后加入调用它的代码.现在WTL也有GDI类了.然而,HDC的封装类就像CWindow一样,只进行了很简单的封装 - 它几乎没有加入任何新的功能.不过,在WTL,你可以得到播放meta文件和OpenGL支持. 最有价值的我猜应该是打印机DC的那些继承类 - WTL有打印机支持,甚至打印预览. 当然也有GDI对象的封装. 诸如画笔,画刷,区域等.WTL对所有的Win32 (和W2K) 通用对话框进行了封装.同样尽管简单,但是它的确使请求字体或者文件变的非常的简单.合成了旧的AtlControls.h,新加了一些封装类. 这些封装类封装了W2K控件,以及一些不属于Win32的"控件",像Command Bar, bitmap button, hyperlink 和 wait cursor.WTL 最终把消息分离带入了ATL! 一些新的MSG映射宏将消息分离,调用您类里的消息处理函数.消息处理函数的参数的值是从消息分离得到的.唯一令人头痛的是,您需要查看头文件以确定函数参数的意义.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值