MFC,WTL,WPF,wxWidgets,Qt,GTK各有什么特点?
框架只能算是一种行为艺术,继续发展下去就变得没用了,比如代码太复杂,编译太慢,调试难解决。
而且包装不全,HWND HDC之类的东西随处可见。
主要用途是写一些小程序,或者作为其他UI框架的后端实现部分。比如我写了一个安装卸载程序的小框架,很小,创建管理窗口的部分是WTL。
MS-VisualC++的类库(Microsoft Foundation Class的缩写)
是更高级的Win API包,比WTL包更彻底,很难看到HWND。
HDC还提供了许多实用程序类,如高级控件、通用容器、IO访问、网络协议等等。此外,它还提供了一些基本框架,如
Document/View是MVC的简化版,只有MV,但在数据管理和消息传输上没有约束,导致了Doc/View的乱用。
妈的。尤其是对于事件处理模型,消息映射是一种简单且容易出错的方式,其唯一的优点就是性能好。来自VC++
MFC在1应运而生。x当时整个UI社区的设计思路都比较落后(苹果除外),MFC背负着沉重的兼容包袱,比如vc++。
1.52的MFC程序在vc2003中稍加修改就可以编译,导致MFC后期没有开发,只是沿着旧的思路改进了一些细节,增加了一些组件,但是有了一个根本性的设计。
问题没有改善。
吃过语言亏的GTK,用c写面向对象真的很痛苦,虽然思想上比MFC先进,但是写出来的代码比MFC啰嗦多了。相比MFC,在事件处理上更多了布局和信号/槽的概念,虽然用起来很麻烦。
wxWidgets,
这基本上是一个跨平台的MFC,抽象了不同平台之间的差异。其实大部分后端都是平台原生API实现的,很多控件都是系统直接原生的。有
wxWidgets用于
GTK+的版本,后端是GTK+,wxWidgets是外壳。这也是wxWidgets的优势。WxWidgets编译的程序分发包比较小,性能不错。
这些都是90年代UI框架的技术层面,至今没有太大进展。
先说21世纪的技术。
Qt,
虽然也是90年代出现的,但是在20世纪有了很大的进步。应该说它的起点比较高,一开始就定位跨平台,并不满足于简单的封装系统API,而是
要自己创建一套完整的API和框架,甚至替换系统API,所以不仅仅是做UI,而是涉及到APP开发中用到的一切,包括网络、数据库、多媒体。
脚本引擎等。Signal/slot是Qt发明的,是C++语言在事件通知模型中最好的实现。连我都觉得应该写进C++标准,估计C++委员会也很固执。
我们从来不写GUI。
早期的QT没有DirectUI的概念,每个QWidget对应一个原生窗口。从Qt4.4开始,只有顶层。
QWidget是原生窗口,子Widget是异类。
Widget只是一个与原生窗口不对应的抽象层,实现了DirectUI的概念,很多图形效果成为可能,比如窗口层叠透明效果。
QPA(Qt平台抽象)是在4.8之后实现的,这使得移植Qt变得很容易。目前Qt是支持平台最多的框架之一。
由于前期授权的问题,Qt对开源社区不是很友好,导致推广不理想,直到改成LGPL模式。如果Qt能早点熬过去,恐怕wxWidgets就没有生存空间了。
QT也有一些缺点,就是太大了,但是可以自己切。我可以在分发包压缩后把Qt库剪成2.5MB。
WPF,
微软赢了
在Form的思考走进死胡同之后,我终于下定决心,用正确的方式开发UI库。21世纪的UI肯定是已经定义好了的,永远无法用代码写出来,所以XAML就是原因。
强大的定义工具不仅可以定义UI布局,还可以包含图形动画效果和消息响应方法。有了优秀的语言C#,更是如虎添翼。但问题也很明显,就是太庞大了。
开发不仅需要庞大的IDE和设计工具,发布的安装包也是庞大的,所以目前很少有人和他一起写通用软件客户端,大部分都是做企业项目的时候写专用客户端。
大概4-5年前,我用WPF写了一个QQ,只实现了基本功能就比C++客户端大很多,而且运行很慢,主要是内存消耗太大,当时WPF的优化还不充分。
最后,我想补充一下UI库的真正王者,可可。
苹果的成功有很多原因,其中一个就是可可。可可的理念很超前,很早就出来了。我怀疑Qt和WPF有很多来自可可的想法。
明确的UI,有了xib,UI的大部分细节都可以定义,并且提供了一个所见即所得的可视化设计工具。
严格的MVC,而且定义非常清晰,分工明确。
Signal/slot,虽然不是这个名字叫的,但是思路是,而且真的可以通过拖动鼠标来连接。
提供了ARC、闭包和反射,给UI开发带来了极大的便利,当然这要归功于语言Objective-C。
加上Borland的猫头鹰和VCL。
我开始用Borland C++3.0和Delphi 1.0。当时,Borland看起来很有前途。不幸的是,一系列决策失误导致公司现在几乎消失。同学们不要再往这个坑里跳了。
OWL曾经和MFC是竞争对手,设计思路也差不多。个人认为OWL的API设计更优雅,但是OWL在市场上被MFC彻底打败了。
德尔斐
堪称杰作,在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库,除非你写游戏。