MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?

QtWPF比较---控件布局和消息响应 所谓大道归一,其实很多的方法,虽然初期不同,但发展到一定程度后,往往又会出现惊人的相似之处。   WPFQt是分别隶属微软和Nokia,前者是一个商业开发平台,后者则完全开源。但他们都提供给界面开发者使用。在使用了一段时间之后,发现二者其实有很多相同的思路。   就界面的组织而言,WPF使用xaml来定义控件,完全学习了html的方式。控件之间可以任意组合,任意包含。这相对于MFC 阅读详情

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库,除非你写游戏。

参考:http://www.zhihu.com/question/2348001

wxWidgets:深入了解wxAUI管理窗口布局 wxAuiManager允许程序员将各种不同的窗口类型(例如工具栏、状态栏、文本编辑器或者任何其他wxWindow派生类)与主窗口相连接,以实现复杂的布局方案。通过创建一个wxWindow对应的wxAuiPaneInfo,我们可以设置这个窗口的属性,例如窗口名称、位置、尺寸等。然后,创建需要添加到主窗口的窗口,例如一个wxPanel、一个wxToolBar以及一个wxNotebook。其中,wxAUI是wxWidgets的一个扩展库,允许用户在程序中使用自定义窗口布局和管理工具栏等控件。 阅读详情

相关推荐

Qt实现一个仿微信的聊天界面

接下来,我们需要在左侧的QScrollArea中添加一个QWidget,该QWidget用于存储所有的消息记录。为了更好地表现出消息列表的样式,我们可以将QWidget的背景色设置为白色,并且将其边框设置为稍微厚一点。为了能够更好地区分不同用户的消息,我们可以使用不同的头像和姓名。右侧的QScrollArea用于输入消息,我们可以使用QTextEdit控件实现这个功能。为了使整个窗口更加美观,我们可以设置QSplitter的边框和背景颜色,以及调整两个QScrollArea的大小。

ByteBuster的博客 2219

MFCWTL 、ATL、STL联系与区别

MFCWTL 、ATL、STL联系与区别    这个要先从C++和VC++说起!    c++是一门语言,它与平台无关。只要能提供c++编译器(或者交叉编译器)的平台,就能用c++编程。基本上常见的操作系统都有C++编译器或交叉编译器,所以你可以认为几乎所有的平台都可以使用C++编程。   首先要明确,严格来说VC++不是语言,而是一个工具软件。他甚至不是编译器,而是一个开发环境(

学海无涯 2535

MFCWTLWPFwxWidgetsQtGTK的对比

WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决。 而且封装得也不完全,还是随处可见 HWND HDC之类的东西。 用途主要是写一些很小的程序,或者作为其他UI框架的后端实现

小豪之家 5577

C++UI框架

WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决。 而且封装得也不完全,还是随处可见 HWND HDC之类的东西。 用途主要是写一些很小的程序,或者作为其他UI框架的后端实现部分,比...

weixin_34137799的博客 1014

WPFQt:两个强大的桌面应用程序开发框架对比

如果你的应用程序主要面向Windows平台,且你熟悉.NET技术栈,那么WPF可能是一个很好的选择。WPFWPF内置了强大的数据绑定机制,允许开发人员将数据与界面元素进行绑定,实现数据的自动更新。QtQt是一个跨平台的开发框架,支持多个操作系统,包括Windows、macOS、Linux等。WPFWPF是微软的技术,因此可以利用.NET Framework的强大功能和丰富的第三方库。QtQt使用C++作为主要的编程语言,但也提供了对其他语言的支持,如Python和JavaScript。

清风专栏 8526

MFC,ATL,WTL的历史沿袭

需求推动了技术的发展,从MFC到ATL,从ATL再到WTL的发展历程我想就是一个最好的见证。 早期的VC++开发者们发现了MFC(Microsoft Foundation Classes) 这样一个好东东。他们发现,MFC提供了一个强大的类库,很好的满足了面向对象编程的需要。随着泛型编程技术的发展和时间的推移,慢慢地,他们慢慢觉得MFC的类库过于庞大和宽泛,而且它提供的模板库只覆盖了很有限的

numbibi的专栏 1485

VC++、MFC、COM和ATL的区别

From: http://hi.baidu.com/huqingshuye/blog/item/c55bd12ca5fa1b5b4ec2263f.html 一、什么是MFC     微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是WinOS下开发人员使用的专业C++ SDK(SDK,Stand...

weixin_34124939的博客 400

有小伙伴问:上位机用QT还是winform/wpf好?

楔子有小伙伴问:上位机用QT还是winform/wpf好?Qt是C++写的,跨平台的UI框架,Winform/wpfC#写的不跨平台的Windows上运行的UI框架。这两个说到底是语言本质的争论或者区别。优点Qt的优点是可以跨平台运行UI界面,在Linux,Windows,MacOs上都可以运行。甚至于在安卓系统上也可以一展身手,在这个非PC端为唯一的现代化工程程式软件上,QT有的优点极为明显。...

dotNET跨平台 1万+

MFCVCL

    网上争论VC和DELPHI/BCB优劣的朋友甚多(其实不是最近,一直都很多),其实真正有分歧的多半在MFCVCL两套类库的选择上。不知道诸位对这两套类库,或者说是Application Framework(下面简称AF)的理解究竟如何?     对于一套AF,跟一套类库class library最大的不同,在于它是一套完整的已经构建好的框架,风格、结构都已经做好,你不得不去遵守,而类库讲

Rolin的专栏 1883

VCLMFC好在哪里

作者:刘国华 链接:https://www.zhihu.com/question/35218485/answer/118472021 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 从使用感受而言,VCLMFC不知道多少条街,VCL虽然是基于Pascal实现的,然后C++Builder又在上面套了一层C++的壳,但是对于使用C++的人来说,已经非常好用了。记得当时(2002年

qq_31209383的博客 1717

[转]剖析ATL、WTL CString的实现

源于http://hi.baidu.com/xiaoyaoyiyiyun/blog/item/c6d102fa3989e9344f4aea86.html 话说CString这个东西困扰了很多年轻人,因为它会引起诡异的编译错误,今天跟着我一起来深入ATL、WTL头文件,来把这个东西搞个清清楚楚。 【涉及到头文件】   ATL: atlstr.h, atlsimpstr.h   MFC : ...

weixin_30825199的博客 332

WMI、WQL语言、WQL测试工具wbemtest.exe

Windows Management Instrumentation(WMI) 是 Windows 操作系统的一个组件,允许通过编程方式访问应用程序、服务和其他计算机组件的管理信息(例如,配置设置和属性值)。.NET Framework 中的 WMI 基于原始的 WMI 技术,允许利用 .NET Framework 中的编程优势进行同样的应用程序和提供程序开发。有关详细信息,请参阅.NET F...

weixin_30488313的博客 367

MFC简介以及基础使用(小白级别入门讲解)

目录Windows消息机制窗口句柄消息与消息队列WinMain函数Windows编程模型MFCMFC简介MFC程序入口MFC的消息映射 Windows消息机制 窗口 一个Windows应用程序中至少有一个窗口,称为主窗口。我们在客户区进行图案的绘制。 句柄 一个Windows应用程序是包含图标、光标等许多部件(资源),系统在为这些部件(资源)分配内存后会返回他们的标识号,也就是所谓的句柄。比如在Windows应用程序中,使用窗口句柄来标识每一个窗口。对窗口进行操作时候,首先就是得到这个窗口的标识。 消息与消

qq_45549336的博客 5万+
上一篇: 杜绝返回函数内局部变量的指针或引用
下一篇: VC6工程升级VS2013遇到的问题
jinvmen
博客等级 码龄15年 16粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值