WTL都算不上什么Framework,就是利用泛型特性对Win API作了层封装,设计思路也没摆脱MFC的影响,实际上用泛型作UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得无法用了,好比 代码过于复杂,编译太慢,出错很差调试等问题难以解决。
并且封装得也不彻底,仍是随处可见 HWND HDC之类的东西。
用途主要是写一些很小的程序,或者做为其余UI框架的后端实现部分,好比我写过一个小框架用来作安装卸载程序,很是小,其中建立管理窗口部分是用WTL的。
MFC是更高级点的Win API封装,比WTL封装完全,很难见到HWND HDC了,也提供了很多实用工具类,好比高级控件,泛型容器,IO访问,网络协议等。除此以外,还提供了一些基本框架,好比 Document/View,这就是个MVC的简化版本,只有MV,可是对于数据的管理,消息的传递等又没有什么约束,致使Doc/View被用得乱七八糟。尤为是对事件处理的模型,消息映射是功能简陋,并且容易出错的方式,惟一优势是性能好。 从VC++ 1.X就有MFC了,那时整个UI界的设计思想都比较落后(除了Apple),MFC又背负了沉重的兼容性包袱,好比vc++ 1.52的MFC程序到了vc2003稍加修改均可以编译,致使MFC后期没有什么发展,就是沿着老的思路完善了些细节,添加了些组件,可是根本性的设计问题没有改进。
GTK,这个吃了语言的亏,用C写面向对象实在是痛苦,虽然在思想上比MFC要先进了些,可是写出来的代码比MFC要罗嗦不少了。相比MFC,多了Layout的概念,事件处理上有了Signal/slot,虽然用起来很麻烦。
wxWidgets,这个基本就是个跨平台的MFC,对各个平台的差别作了抽象,实际上后端大多仍是用平台原生的API实现,好多控件都是直接用系统原生的。有wxWidgets for GTK+的版本,后端就是GTK+,wxWidgets就是一层壳。这也是wxWidgets的优势,它编译出来的程序发行包比较小,性能也不错。
以上这些就是上世纪90年代的UI Framework技术水平了,至今它们也依然没有太多进步。
下面来谈谈21世纪的技术。
Qt,虽然它也是上世纪90年代出现的,可是它在21世纪有了长足的进步。应该说它的起点就比较高,一开始就定位跨平台,并且不知足于简单封装系统API,而是要本身创造出一套完整的API和框架,甚至要代替系统API,因此不只仅是作UI,而是涉及到了APP开发所用到的全部东西,包括网络,数据库,多媒体,脚本引擎等。signal/slot是Qt发明的,这是事件通知模型里C++语言的最佳实现了,甚至我都以为这该写进C++标准,估计C++委员会的老顽固们是从不写GUI的。
早期的QT也是没有DirectUI的概念的,每个QWidget都对应一个原生窗口,从Qt4.4开始,只有顶层QWidget才是原生窗口,而Child Widget是Alien Widget,只是个抽象的图层不对应原生窗口,这就实现了DirectUI的概念,不少图形效果也就变得可能了,好比窗口层叠透明效果。
在4.8后实现了QPA(Qt Platform Abstraction),这就使移植Qt变得很容易,目前Qt是支持平台最多的框架没有之一。
因为早期受权的问题,Qt对于开源社区不是很友好,致使推广不太顺利,直到它改为了LGPL方式,若是Qt能早点想开了,恐怕就没有wxWidgets的生存空间了。
Qt的缺点也是有的,就是太大,不过能够本身剪裁,我能够把QT库剪裁到发行包压缩后2.5MB。
WPF,微软在Win Form的思路上走到死胡同后,终于痛下决心用正确的方法开发UI库了。21世纪的UI必定是定义出来的,绝对不能是代码写出来的,因此有了XAML这个强大的定义工具,不但能够定义UI布局,还包括图形动画效果,消息响应方式等。配合C#这种优秀的语言,更是如虎添翼。可是问题也很明显,就是过于庞大,不只开发时要用到庞大的IDE和设计工具,发行的安装包也十分巨大,因此目前仍是不多有人拿他写通用软件客户端的,大可能是作企业项目时写专用客户端。
大概4-5年前吧疼讯曾经用WPF写了个QQ,可是只实现了基本功能就已经比C++客户端大好多了,并且运行缓慢,主要是太吃内存,并且那时WPF的优化还不充分。
最后我想补充下真正的UI库之王,cocoa。
Apple的成功有不少缘由,其中之一就是cocoa,cocoa理念十分先进,并且出来得早,我都怀疑Qt和WPF有很多思想都是借鉴cocoa的。
定义式的UI,用xib就能够定义UI的绝大部分细节,并且提供所见即所得的可视化设计工具。
严格的MVC,并且定义很是清晰,分工明确。
signal/slot,虽然不叫这个名字,但思想就是,并且真的是拖动鼠标就能connect。
提供了ARC,闭包和反射,给UI开发带来巨大的便利性,固然这得益于Objective-C这个语言。
再补充下 Borland的OWL和VCL。
我是从Borland C++3.0和Delphi 1.0开始用的,那时的Borland看来颇有前途的,惋惜后来一系列决策失误致使如今这个公司几乎消失了,同窗们不要再往这个坑里跳了。
OWL曾经和MFC是竞争对手,设计思想也差很少,我的感受OWL的API设计更优雅一点,可是在市场上OWL被MFC完全击败。
Delphi是神做,它在RAD(快速应用开发)领域长时间没有对手,直到BS架构取代CS架构。Delphi的特色就是简单、开发快,单纯就写个基本可用的应用来讲,可能至今都没有比他更快的,可是缺点就是丑,基本大多数Delphi应用都是一大堆控件堆积在一块儿,很不美观,另外因为Pascal语言的限制没法和现有大量的C/C++代码融合。虽而后来有C++ Builder,可是Builder里简单和快的优势也消失了。Borland的C++编译器越作越差,致使后来开源项目都不太愿意兼容这个编译器了。
VCL准确地说不是UI库,而是一套组件接口规范,相似COM ActiveX。delphi和C++builder都是基于这个规范构建了基础库。
UI库是个很大的话题,够写好几本书来探讨的,我这里就是随便写点本身的感觉。
单纯讨论每一个库的优劣是没有意义的,而是要放到具体的应用场景里来看,每一个库都有本身擅长的场景。
若是仅在Windows下,追求程序小巧,用WTL,不足的地方本身实现去吧,可是视觉效果就呵呵了。
若是能够大一点,还要好看点,那就Qt。
若是彻底不在意大小,只要视觉效果华丽,就用WPF,若是把开发工具价格也考虑进来,那么土豪才会选WPF呢。
MFC就是个鸡肋了,除非你现有的工程师不会用别的,或者有历史遗留代码要保持兼容。
若是要求跨平台,那么就用Qt,wxWidgets和GTK+跟如今的Qt比起来没有什么优点了。
若是是iOS Android,那么最好用原生UI库,除非你写游戏。c++
参考:http://www.zhihu.com/question/23480014数据库