`
tubaluer
  • 浏览: 1445331 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

GTK+ VS MFC

 
阅读更多

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

分享到:
评论

相关推荐

    foundations of gtk+ development.rar

    gtk+是一个跨平台的gui软件包.与MFC类似,可用于编写图形界面.比MFC更易用易学,更为直观.本书是gtk+入门必备.

    改变字体颜色

    /*GtkLabel是少数的几个不创建自己的窗口的GTK+控件之一.相反,它直接的将自己画在父控件上.这就是说:如果你想为GtkLabel控件设置背景,你需要改变它的父控件的的背景. *这是GTK+ FAQ 中"6.10. 如何给GtkLabel控件设置...

    gui开发框架wxwidgets

    它包含一个可以支持现今几乎所有操作系统(Version 2 currently supports all desktop versions of MS Windows, Unix with GTK+, Unix with Motif, and MacOS. An OS/2 port is in progress.)的GUI库和其他一些很...

    code blocks

    Code::Blocks使用C++语言开发,是一个血统纯正的 C/C++程序集中开发环境,用户可以使用它来开发多种程序,Code::Blocks提供了多达20种的工程模板,包括常用的控制台程序、 Win32GUI程序、动态\静态连接库、GTK+工程...

    GNU/GTK Foundation Classes-开源

    另一个基于 GTK 和受 MFC 启发的优秀 C++ 框架库。

    mingw-get-inst-20111118

    如果有 VC++ 的授权,你完全可以使用 MFC 的源代码,也就是你使用 GCC 来编译 MFC 程序是完全可以的。 当然,GNU 下也很多 Windows 程序开发包,甚至有一些是支持跨平台使用的。不仅仅可以直接把源代码编译为 ...

    wxWidgets与其他GUI库的比较

    wxWidgets与其他GUI工具库的比较,比较全面。

    期末作业要做的五子棋项目

    该项目由后端、CLI前端、GTK前端、独立的MFC程序四部分组成。可以跨平台编译、运行。除基础的玩家VS玩家的五子棋游戏之外,实现了新的游戏模式、自定义游戏以及存储、读取存档的功能。用户还可以在该项目提供的后端...

    fltk中文手册简单版

    开发工具包(如MFC、 GTK、 QT等) , 它具有体积很小、 速度比较快, 且有着更好的移植 性。 FLTK(Fast Light Tool Kit 发音为fulltick) 是一种使用C++开发的GUI工具包, 它可以应用 于Unix, Linux, MS-Windows...

    Macintosh MFC Libraries-开源

    尝试将MFC框架移植到Mac OSX。希望它也将很快用于GTK。

    c下的图形文件.txt

    gtk windows mfc class api #include #include int main() { int i ,gdriver,gmode , size; void *buf; gdriver=DETECT; initgraph(&gdriver,&gmode) ; // init graph system setbkcolor(BLUE); //set ...

    基于Qt的跨平台应用开发

    基本上,Qt同XWindow上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。...

    QT视频教程-丁林松.txt

    QT初级到高级编程视频教程-丁林松 讲师姓名:丁林松视频 教程描述:本教程共54节,由...基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。

    QT_CREATE 教程

    基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。

    \Linux环境下基于QT的WLAN管理信息系统

    基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。

    Linux环境下GUI开发工具比较

    基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。

    Qt编程指导(中文)

    基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。

    WonderGUI:用于游戏和多媒体的GUI库。-开源

    与其他GUI工具包(例如Qt,GTK,MFC,Swing等)一样,它通过按钮,复选框,菜单等为程序提供用户界面。WonderGUI与其他GUI工具包的不同之处在于它没有标准的外观和感觉,而是通过您设计的小部件和布局使您自己的...

    如何获得应用程序主窗口的指针

    如何获得应用程序主窗口的指针

Global site tag (gtag.js) - Google Analytics