转载自:http://tech.ddvip.com/2007-11/119640973738229.html

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应用程序必须继承对话框或者其它顶层窗口才行,虽然可以采用中介者模式,把控件之间的交互集中在顶层窗口中,不需要继承控件,但仍然很麻烦

GTK+与MFC不完全对比的更多相关文章

  1. C++&VS项目学习

    vs使用 C++项目中,Solution Explorer主要是逻辑视图(不对应文件的逻辑位置,没有文件夹只有Filter的概念.头文件源文件被自动分配到Header Files和Source Fil ...

  2. 介绍一项让 React 可以与 Vue 抗衡的技术

    好吧,我承认我是标题党.React 明明如日中天,把它与 Vue 倒过来,给 Vue 加点东西或可与 React 抗衡.不过,这两年 Vue 干的正是这事,不断加东西,不断优化,按它现有发展速度超越 ...

  3. 对比MFC资源文件谈谈WPF布局方式

    对比MFC资源文件谈谈WPF布局方式 MFC方式 对于传统的MFC基于UI的应用程序设计通常分两步走,首先是设计UI,使用的是RC文件,然后是代码文件,对RC文件进行操作,如下面Figure 1 的基 ...

  4. 破解 Rith's CrackMe #1(对比IDA查看动态分析中的MFC函数名)

    系统 : Windows xp 程序 : Rith's CrackMe #1 程序下载地址 :http://pan.baidu.com/s/1gecW9Qr 要求 : 注册机编写 使用工具 : IDA ...

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

    WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得 ...

  6. MFC和GTK的区别

    关键技术 http://blog.csdn.net/master_max/article/details/1540204 MFC和GTK的区别?? 1. 两者都是基于面向对象设计的.尽管MFC是用C+ ...

  7. C#中自定义消息,与MFc对比

    在C#中采用的是事件驱动方式,但在我们使用的过程中,有时候通过调用系统原有的消息,处理起来会比较简单一些,特别是在处理与DLL文件的交互时,的确是非常的方便.    在C#中使用自定义消息      ...

  8. 对比MFC和Winform及WPF

    MFC 生成本机代码,自然是很快.可是,消息循环,减缓了界面显示速度.winform 封装了 win32 的api,多次进行P/invoke 操作 (大部分使用p/invoke操作封装),速度慢 .w ...

  9. 定制炫彩界面:duilib与MFC 的对比

    duilib是以DirectUI为技术原理开发的一款轻量级Windows桌面UI库,使用XML来描述界面风格,界面布局,可以很方便的构建高效,绚丽的,非常易于扩展的界面.从而很好的将界面和逻辑分离,同 ...

随机推荐

  1. python基础之进程间通信、进程池、协程

    进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...

  2. LeetCode:21. Merge Two Sorted Lists(Easy)

    1. 原题链接 https://leetcode.com/problems/merge-two-sorted-lists/description/ 2. 题目要求 给出两个已经从小到大排序的链表ls1 ...

  3. 『MongoDB』集合更新操作

    参考 定义 db.collection.update(query, update, options) 改变一个在集合中已经存在的文档或文档数组.默认的,update()方法更新一个独立的文档.如果mu ...

  4. list 集合addAll 和 add 方法小坑

    1.问题 我们经常会遍历 list集合,在遍历的过程中,如果在遍历的过程中添加了 add()  或者 addAll() 方法修改了遍历的list列表,那么会报错. 代码演示: List<Inte ...

  5. C++学习005-循环

    C++在循环方面,感觉个C没有身边么区别 while循环 for循环 do while循环 其实 使用Goto也可以写个循环 编写环境vs2015 1. while循环 int main() { in ...

  6. json格式化显示样式js代码分享

    最近开发中需要在页面展示json.特整理了下代码,送给大家,希望能帮到有同样需求的朋友们. 代码: <html> <script src="http://cdn.bootc ...

  7. Tensorflow Serving介绍及部署安装

    TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库.它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用.更加让人眼前一亮的是,它支持 ...

  8. 福大软工1816:Alpha(2/10)

    Alpha 冲刺 (2/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.学习qqbot库: 2.实 ...

  9. windows下 eclipse搭建spark java编译环境

    环境: win10 jdk1.8 之前有在虚拟机或者集群上安装spark安装包的,解压到你想要放spark的本地目录下,比如我的目录就是D:\Hadoop\spark-1.6.0-bin-hadoop ...

  10. 关于配置tomcat多版本同eclipse的配置问题

    最近很多同学都在反应tomcat和eclipse关联的问题,其他问题网上搜索下大多都有结果,有比较疑难杂症的,下面贴出: 有的同学之前配置过tomcat6的版本或者在此之前做过配置,现在配置tomca ...