d2school

我编程,我快乐!——人人都能学好编程。

| 首页 | 教程 | 辅助教程 | 关于作者 | 本站软件 | 论坛 | CSDN博客 | 帮助 |


跨平台的C++ GUI库——wxWidgets 简介

作者: 南郁/www.d2school.com 2008年08月08日

1.“统一的GUI库”——需要吗?

首先废话一下“GUI”就是“图形用户界面”。而“图形用户界面”就是指你在使用Windows操作系统,或Linux操作系统等时,天天打交道的“窗口、按钮、列表框”等等。

很长时间,很多人抱怨C++语言似乎没有一个统一的图形界面库……这个抱怨是不合理的。

这里的“统一”,往往有三种意思:

  • 第一:跨平台的统一,意思就是不管你在Windows上,在Linux上、在苹果的Mac系统上、甚至在手机上,都通用。
  • 第二:所有C++程序员都“统一”使用同一套GUI库——真正意思是说,“C++标准协会”最好“官方”规定一套GUI库作为标准库,大家只学习一套就好。
  • 第三:界面展示效果上的统一。

这三点需要好好分析。

第一点很好理解,大家都不希望同一个程序,在不同平台要用两套完全不同的代码来实现。顺便地,一说到“跨平台”,很多人就期待起号称“一次编写,到处运行”的Java,可惜,在GUI方面,Java可归为实现得最差的语言之一。

第二点,要求有一套“标准”图形界面库,以一个普通的C++学习者的角度来看,确实也不过份。因为有时“选择太多”也是一种痛苦。然而,如果从“官方”的角度来看, 非要逼着他们做出一个选择,似乎也很难;并且某一方的库有了“垄断”地位之后,恐怕会有些负作用。事实上,C++语言,在图形、数学、网络等等方面,都同样存在很多套优秀的实现,事实上,大家只要根据自身需要,参考他人实际评价,选择一个最合适的就行。何必苦等着官方扭一个标准给你呢?万一不是你的所好呢?

第三点,不仅是C++语言,也是Java等语言“曾经的”追求,但等有了真正的实现之后,用户却不喜欢了。大家最终发现,一套在不同操作系统下都展现一致的界面,原来就是一套“最奇怪”的界面,无论在Linux下还是在Windows下,它的界面都是当前操作系统的风格“格格不入”,夸张一点地说,它就是一个外星来到地球,无论它在美国,还是在中国,谁看它都觉得它长得没个“人样”。所以, 当前,在图形界面的风格上,大家的追求是:你在中国,就长成中国人样;你到美国,就长成美国样——这才是做界面的最高境界。

2. 统一GUI——唯C++能完美实现

三点需求,一下子被我“否定”了两点,这是不是说明,前面的抱怨是有理由的呢?即:是否C++根本就做不到统一的图形界面库呢?

答案是:如果C++做不到统一图形界面库,那么,几乎就没有别的编程语言可以做到了。为什么这么说?

在IT界,GUI是一个“古老的”话题了,如果同样“古老的”C++语言都解决不了,那还有什么新新人类的幼稚语言可以解决?——呵呵,这样说当然是了。换一种说话吧,在IT界,GUI是一个“绝对复杂的”话题了,如果同样“绝对复杂的”C++语言都解决不了,那么,那些正好自称是“简单的”语言可以解决呢?——不同,这样还是会被认为是强辞夺理。事实是,无论是Windows还是Linux,多数架于操作系统之上的图形用户界面,都是通过C及C++语言写成的,可以说,C++语言是和各个GUI系统一起成长的,并且一直就是解决各类GUI问题的主力军。

很多从c++语言发展或改造的语言,比如Java,在实现跨平台的GUI时,曾经去试过前述的“第三点”,想完全自己画一种“统一界面”,但这种思路失败了。于是改走“本地化”的路线,一到走“本地化”这个路线,不同操作系统之间的不同图形界面之间的庞大复杂性马上显现。典型的是Java语言为了简化编程难度,实现了“内存自动回收”,这功能对普通内存数据的管理,相当简捷有效,但遇上图形界面的资源,却成了严重问题。所有依赖“虚拟机”的,不能直接访问操作系统GUI接口的编程语言,在这一点上和C/C++做比较,正是取自身之短,相比C++之长。

.Net的C#等语言在跨平台上实现上,那是一个矛盾。因为它隶属于微软公司,而我们并不明白微软是不是喜欢大家在非Windows的平台上,比如在Linux系统上使用C#来实现Linux的图形界面。

事实上,大家也看到Java或C#语言并更多地用在B/S结构上,也就说是它们实际放弃了本地界面的实现,完全把界面放到网页上,由大家机器上的浏览器,比如IE或Firefox去实现,而IE或FF,其实也是用C/C++写成的一个客户端。

可能会问,那么C语言呢?在解决“统一”GUI这个问题上,C语言和C++相比,会不会更好些?事实也不是。C语言主要发力处在于实现不同平台上各自一套的图形界面上。比如,无论是Linux上或是Windows下,多数GUI原始接口绝大多数以C语言的形式提供接口,关键问题就是这些接口在同不系统上表现得千差万别,于是造成了GUI无法在这方面统一的问题。要将这些千差万别的接口进行统一,C++语言所具备的,比C语言方便得多的“抽象”能力,正好起作用。

如此分析之后,之所以说C++最适合于解决统一GUI问题,也就一句话:天生与C语言无缝的能连接;又具备比C语言更为方便的抽象表达能力。

3.为什么是wxWidgets?

原因如下:

  • 相对完美的跨平台能力:在一套代码的基础上,实现了Win32, Mac OS X, GTK+, X11, Motif, WinCE等多个平台的图形用户界面。
  • 历史悠久(1992年开创),很成熟,发展良好。 本站推荐的C++ IDE,也是使用wxWidgets 实现跨平台界面。
  • 开源、免费
  • 既支持“本地风格”的界面展现(推荐),也可以实现“统一风格”的界面展现。
  • 相关配套设施方便:图形用户界面方面,可选还有gdi++(Windows特有图形增强库),以及OpenGL支持等,非图形界面的功能,同样强大,包括:目录、文件操作、线程……
  • 和Code::Blocks结合良好。除了C::B本身也是它写成的之外,Code::Blocks也内置了wxWidgets的可视化设计工具。
  • 支持各种编译库形式,静态的动态的,调试的发行的,无论是编码阶段还是发行阶段,都相当方便。
  • 对UNICODE的良好支持。可以通过简单配置,编译出非unicode和unicode编码。(本站采用UNICODE版本,要利于编程时对汉字的良好支持)。
  • 相关资料丰富
  • 支持多种编译器,包括VC,BC,以及本站默认使用的gcc。
  • 最后一点也最本质:wxWidgets对常见的图形用户界面支持非常良好,同时也扩展实现了很多方便的高级图形控件。

这里给出C++学友相对比较关心的“可视化”设计界面,展示了在Code::Blocks中如何设计使用wxWidgets库:

Code::Blocks中的可视化设计

(Code::Blocks中的可视化设计)

实际运行效果如下图:

实际运行效果

(实际运行效果)

这是在Windows XP 下运行的效果,如前所述,它的展现完全采用当前操作系统的本地图形界面风格。

4. 相关网站

wxWidgets官方网站 : http://www.wxwidgets.org/