为什么80%的码农都做不了架构师?>>>   

今天看到一篇关于GTK+和MFC对比的文章,学GTK+编程的来看看

MFC已经江河日下,日渐式微,而GTK+可谓欣欣向荣,如日中天。这里无意于落井下石,痛打落水狗,贬MFC而尊GTK+。自己即在使用MFC也在使用 GTK+,不会偏袒其中之任何一方。这个对比完全出于个人对两者的理解,说它是不完全对比,一方面只是一时兴起想做个笔记而已,另外一方面我对两者的理解 也是有限的。

1.         两者都是基于面向对象设计的。尽管MFC是用C++写的,而GTK+是用C写的,但思想都是面向对象的。GTK+使用glib的对象机制,由于用C写的,其实现相对有点繁琐。

2.         两者都是基于消息驱动的。这是GUI系统的共性,消息可以是硬件上报的,如鼠标事件、键盘事件和触摸屏等等,也可以是程序产生,如一个窗口给另外一个窗 口发送了一个消息。但两者并不完全相同,GTK+通过select挂在多个文件描述符上,可以同时等待多个事件源,比如socket、子进程退出和内核事 件等等,而MFC只能通过GetMessage挂到消息队列上。

3.         两者都不是线程安全的,即只有一个线程可以操作GUI资源。主要是出于性能的考虑,这个问题不大,因大多数应用程序都是单线程的。而且它们都提供一些机 制,让其它线程可以在必要时操作GUI资源。在GTK+中可以通过idle函数来实现,在MFC中可以通过PostMessage来实现(附带说明一 下:Win32原生的GUI API是线程安全的)。

4.         GTK+整合了一系列的基础函数库,功能强大,而MFC孤军做战,势单力薄。Glib是GTK+的基本库,里面实现了常见的容器和算法,可谓应有尽有, 同时隔离了平台相关的功能。Pango是GTK+用于文字渲染的函数库,它负责控制不同文字的layout布局,而把字模的绘制交给freetype等字 体函数库处理。MFC虽然实现了一些容器,但数量不多也不好用,除了对原生GUI API的包装外,没提供多少其它功能,与Microsoft Foundation Class Library这个名称一点都不相称。

5.         GTK+是跨平台的,而MFC则不是。GTK+在设计时就考虑了可移植性,它按分层模型来组织整个系统,Glib封装了依赖于OS平台的函数,提供一套 抽象的接口,在不同的平台有不同的实现。GDK封装了依赖于输入/输出设备的功能,如键盘事件的获取和显示缓冲的输出,同时实现了基本的绘图功能。 GTK+几乎可以在所有PC平台下运行,而MFC从来都没有考虑过可移植性,它是与Win32 GUI绑定在一起的。

6.         GTK+小巧,而MFC笨重。GTK+编译出来的可执行文件约3M左右,而MFC本身虽然不大,但它各种版本加在一起就可观了。MFC有ansi版本、 有unicode版、有debug版、有release版、还有一些组合,如果你因此而晕倒了,那是很正常的。

7.         GTK+的使用简单,MFC的使用繁琐。GTK+的使用比较简单,即使在没有工具的帮助下,要写一个GTK+的应用程序也不难,实际上绝大多数GTK+ 应用程序都是一行代码一行代码的敲出来的。而MFC的使用则太麻烦了,很难想象没有VC的向导的帮助,写一个基于MFC的应用程序。即有了VC的向导,仍 有大量的程序员说MFC很难用。

8.         GTK+使用signal机制,解开消息源与消息目标之间耦合。而MFC使用消息,将消息源与消息目标硬编码在一起。Signal的好处是,不需要知道 目标是谁,谁关心谁就注册,这种出版订阅机制是解耦的最佳方式。而MFC的消息则是必须知道目标是谁,把消息源与消息目标死死的绑在一起。MFC提供了一 套文档/视图框架,实现了类似出版订阅的功能,这本是设计者引以自豪的东西,结果因为太复杂不能被人理解,反而为开发人员所诟病。

9.         GTK+采用layout机制动态计算各子窗口的坐标位置,自适应屏幕大小的变化。而MFC要求子窗口的坐标位置硬编码,结果要适应不同分辨率的屏幕非 常困难。GTK+在窗口布局时分为两个阶段,第一个阶段父窗口先询问子窗口的最佳大小,第二个阶段父窗口根据自己的大小计算子窗口的实际大小,子窗口根据 实际大小进行调整。

10.     GTK+采用容器机制来合理分离控件的职责,MFC没有容器这个概念,很难实现递归组合。GTK+中差不多所有控件都是容器,都可以容纳其它任何控 件,而MFC只有顶层窗口才是容器,可以容纳其它子控件。容器这个概念对代码重用的影响非常之大,这里举两个例子:其一是带图片的按钮 (BitmapButton),在GTK+中它就是GtkImage和GtkLabel的组合,而在MFC中,图片和文字都要自己绘制。前者的 GtkImage和GtkLabel可以在很多地方重用,而后都的绘制代码和事件处理代码只有自己才能使用。其二是列表框,在GTK+中,它只是一个容 器,你可以向里面放编辑器、下拉框和其它任何者你想得到的控件。而在MFC中,即使只是实现一个不同外观的列表框,你都要采用自绘的方式,代码重用非常困 难,向列表框中加入其它控件就更麻烦了,要使用一些非同寻常的手段不可。

11.     GTK+采用容器机制优先使用组合而不是继承,符合现代设计的原则。MFC强制使用继承,使用麻烦而且耦合紧密。GTK+应用程序不需要继承任何窗 口。MFC应用程序必须继承对话框或者其它顶层窗口才行,虽然可以采用中介者模式,把控件之间的交互集中在顶层窗口中,不需要继承控件,但仍然很麻烦。

转载于:https://my.oschina.net/dake/blog/196823

GTK+ VS MFC相关推荐

  1. 基于X的GNOME、GTK、GDK、XLib、GLib等之间的关系

    基于X的GNOME.GTK.GDK.XLib.GLib等之间的关系 什么是Xlib? The X Library是X Window程式最低階的API,如果拿來和Windows 比較起來,Xlib 就和 ...

  2. Overview of GTK+ and its Libraries

    目录 Architecture Creation License Languages Community Architecture Over time GTK+ has been built up t ...

  3. GTK、GDK、GLIB三者的关系

    什么是GDK?       GDK是标准Xlib函数调用的一个基本封装(wrapper),如果你对Xlib很熟悉,就不需要来重新熟悉绝大多数的GDK函数.所有的函数都是为了提供一个方便直观的风格来访问 ...

  4. 全志 Tina Linux 图形系统 框架介绍 最全介绍 MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland

    1 概述 本文档将介绍 Allwinner Tina Linux 中已经移植好的窗口系统,以及怎么使用,包括 MiniGUI.QT5.EFL.GTK+(WebkitGtk.Midori).Direct ...

  5. C++著名程序库的比较和学习经验

    内容目录: 1.C++各大有名库的介绍--C++标准库 2.C++各大有名库的介绍--准标准库Boost 3.C++各大有名库的介绍--GUI 4.C++各大有名库的介绍--网络通信 5.C++各大有 ...

  6. C++各大著名程序库

    转载自:http://www.kuqin.com/language/20090215/34991.html 和http://www.kuqin.com/language/20090215/34991. ...

  7. C++ 著名程序库 概览

    本文转载自: http://ace.acejoy.com/thread-3777-1-1.html 1.C++各大有名库的介绍--C++标准库 2.C++各大有名库的介绍--准标准库Boost 3.C ...

  8. 语言程序推箱子课设报告_学完C语言,可以去哪些应用领域工作?

    C语言是目前世界上流行.使用非常广泛的高级程序设计语言. 在TIOBE已公布2020年8月的编程语言排行榜.C语言依然保持排行第一! 前20名排行如下: C语言对操作系统和系统使用程序以及需要对硬件进 ...

  9. C++著名类库和C++标准库介绍

    C++著名类库 1.C++各大有名库的介绍--C++标准库  2.C++各大有名库的介绍--准标准库Boost  3.C++各大有名库的介绍--GUI  4.C++各大有名库的介绍--网络通信  5. ...

最新文章

  1. repo 修改邮箱地址
  2. 计算的极限(零):逻辑与图灵机
  3. 用VS.NET中的测试工具测试ASP.NET程序
  4. 后台产品经理跳坑“指南”
  5. Eclipse中新建SpringBoot项目并输出HelloWorld
  6. kdj指标主要看哪个值_悟空CRM:在线crm主要看这两个指标,都非常重要!
  7. python @修饰符_Python修饰符,返回替换了一个或多个参数的函数
  8. java writebytes()_Java ObjectOutputStream writeBytes()方法与示例
  9. gcc,make和cmake
  10. 一只火鸡带你了解大数据预测(经典)
  11. SQL Server与Oracle中的隔离级别
  12. 即时语音提示软件php,InsTalk即时语音提示校对软件(语音识别和语音合成软件)
  13. python在线编辑器
  14. ASP.NET MVC——XX点餐管理系统后台项目实训总结书
  15. Windows10系统出现休眠后电脑屏幕黑屏无法唤醒解决办法
  16. PHP 开发新版个人博客
  17. 平衡二叉树 构造方法RR RL LL LR
  18. Java实现 四舍五入取整到百位 四舍五入取整到千位 数字取整到千位 数字取值到千位 数字取整到百位 数字取值到百位
  19. 这四十年来的香港歌坛在唱些什么,“南中国听歌最多”的数据分析师带你一探究竟...
  20. smart 支持标签

热门文章

  1. JS中调用本地exe程序
  2. Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
  3. Thrift介绍以及Java中使用Thrift实现RPC示例
  4. SpringBoot+AntV实现饼状图中的花瓣图
  5. SpringBoot+Junit在IDEA中实现查询数据库的单元测试
  6. Kindeditor中上传本地照片后需要带域名的绝对路径实际获取为相对路径
  7. 创建Maven项目时实际使用JDK为1.8,该怎样修改其默认的JDK1.5
  8. 基于用例点来度量软件规模并管理进度 之二
  9. 4、Docker 提交运行中容器作为新的镜像
  10. java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载