|
MFC 已经江河日下,日渐式微,而 GTK+ 可谓欣欣向荣,如日中天。这里无意于
落井下石,痛打落水狗,贬 MFC 而尊 GTK+ 。自己即在使用 MFC 也在使用 GTK+ ,不会偏袒其中之任何一方。这个对比完全出于个人对两者的理解,说它是不完全对比,一方面只是一时兴起想做个笔记而已,另外一方面我对两者的理解也是有限的。
两者都是基于面向对象设计的。
尽管 MFC 是用 C++ 写的,而 GTK+ 是用C 写的,但思想都是面向对象的。GTK+ 使用 glib 的对象机制,由于用 C 写的,其实现相对有点繁琐。
两者都是基于消息驱动的。
这是 GUI 系统的共性,消息可以是硬件上报的,如鼠标事件、键盘事件和触摸屏等等,也可以是程序产生,如一个窗口给另外一个窗口发送了一个消息。但两者并不完全相同,GTK+ 通过 select 挂在多个文件描述符上,可以同时等待多个事件源,比如 socket 、子进程退出和内核事件等等,而 MFC 只能通过 GetMessage 挂到消息队列上。
两者都不是线程安全的,即只有一个线程可以操作 GUI 资源。
主要是出于性能的考虑,这个问题不大,因大多数应用程序都是单线程的。而且
它们都提供一些机制,让其它线程可以在必要时操作 GUI 资源。在 GTK+ 中可
以通过 idle 函数来实现,在 MFC 中可以通过 PostMessage 来实现(附带说明
一下:Win32 原生的 GUI API 是线程安全的)。
GTK+整合了一系列的基础函数库,功能强大,而MFC孤军做战,势单力薄。
Glib 是 GTK+ 的基本库,里面实现了常见的容器和算法,可谓应有尽有,同时
隔离了平台相关的功能。Pango 是 GTK+ 用于文字渲染的函数库,它负责控制不
同文字的 layout 布局,而把字模的绘制交给 freetype 等字体函数库处理。
MFC 虽然实现了一些容器,但数量不多也不好用,除了对原生 GUI API 的包装
外,没提供多少其它功能,与 Microsoft Foundation Class Library 这个名称一点都不相称。
GTK+ 是跨平台的,而 MFC 则不是
GTK+ 在设计时就考虑了可移植性,它按分层模型来组织整个系统,Glib 封装了
依赖于 OS 平台的函数,提供一套抽象的接口,在不同的平台有不同的实现。
GDK 封装了依赖于输入/输出设备的功能,如键盘事件的获取和显示缓冲的输出,同时实现了基本的绘图功能。GTK+ 几乎可以在所有 PC 平台下运行,而 MFC 从来都没有考虑过可移植性,它是与 Win32 GUI 绑定在一起的。
GTK+小巧,而MFC笨重
GTK+ 编译出来的可执行文件约 3M 左右,而 MFC 本身虽然不大,但它各种版本
加在一起就可观了。MFC 有 ansi 版本、有 unicode 版、有 debug 版、有
release 版、还有一些组合,如果你因此而晕倒了,那是很正常的。
GTK+的使用简单,MFC的使用繁琐
GTK+ 的使用比较简单,即使在没有工具的帮助下,要写一个 GTK+ 的应用程序
也不难,实际上绝大多数 GTK+ 应用程序都是一行代码一行代码的敲出来的。而
MFC 的使用则太麻烦了,很难想象没有 VC 的向导的帮助,写一个基于 MFC 的
应用程序。即有了 VC 的向导,仍有大量的程序员说 MFC 很难用。
GTK+ 解开消息源与消息目标之间耦合
GTK+ 使用 signal 机制,解开消息源与消息目标之间耦合。而 MFC 使用消息,
将消息源与消息目标硬编码在一起。Signal 的好处是,不需要知道目标是谁,
谁关心谁就注册,这种出版订阅机制是解耦的最佳方式。而 MFC 的消息则是必
须知道目标是谁,把消息源与消息目标死死的绑在一起。MFC 提供了一套文档/视图框架,实现了类似出版订阅的功能,这本是设计者引以自豪的东西,结果因为太复杂不能被人理解,反而为开发人员所诟病。
GTK+ 采用 Layout 机制,MFC 对坐标硬编码
GTK+ 采用 layout 机制动态计算各子窗口的坐标位置,自适应屏幕大小的变化。
而 MFC 要求子窗口的坐标位置硬编码,结果要适应不同分辨率的屏幕非常困难。GTK+ 在窗口布局时分为两个阶段,第一个阶段父窗口先询问子窗口的最佳大小,第二个阶段父窗口根据自己的大小计算子窗口的实际大小,子窗口根据实际大小进行调整。
GTK+ 采用容器机制来合理分离控件的职责,MFC 没有容器这个概念
GTK+ 采用容器机制来合理分离控件的职责,MFC 没有容器这个概念,很难实现
递归组合。GTK+ 中差不多所有控件都是容器,都可以容纳其它任何控件,而
MFC 只有顶层窗口才是容器,可以容纳其它子控件。容器这个概念对代码重用的
影响非常之大,这里举两个例子:其一是带图片的按钮 (BitmapButton),在
GTK+ 中它就是 GtkImage 和 GtkLabel 的组合,而在 MFC 中,图片和文字都要
自己绘制。前者的 GtkImage 和 GtkLabel 可以在很多地方重用,而后都的绘制
代码和事件处理代码只有自己才能使用。其二是列表框,在 GTK+ 中,它只是一
个容器,你可以向里面放编辑器、下拉框和其它任何者你想得到的控件。而在
MFC 中,即使只是实现一个不同外观的列表框,你都要采用自绘的方式,代码重用非常困难,向列表框中加入其它控件就更麻烦了,要使用一些非同寻常的手段不可。
GTK+采用容器机制优先使用组合而不是继承,符合现代设计的原则。
MFC 强制使用继承,使用麻烦而且耦合紧密。GTK+ 应用程序不需要继承任何窗
口。MFC 应用程序必须继承对话框或者其它顶层窗口才行,虽然可以采用中介者模式,把控件之间的交互集中在顶层窗口中,不需要继承控件,但仍然很麻烦。
来源
http://blog.csdn.net/absurd/
|