跨平台GUI框架-wxWidgets
2013-12-16 12:03:20 阿炯

wxWidgets是一个开源的跨平台的C++构架库(Framework),它可以提供 GUI(图形用户界面)和其它工具,支持所有版本的Windows、带GTK+或Motif的Unix和MacOS。采用类LGPL协议授权(下文有对授权的详述)。它提供了一个易于使用的API,用于在多个平台上编写GUI应用程序,该应用程序仍在使用本机平台的控件和实用程序。与适合的平台和编译器的合适库链接,应用程序将采用适合该平台的外观和感觉。除了出色的GUI功能之外,wxWidgets还提供了:在线帮助,网络编程,各种流操作,剪贴板和拖放,多线程,各种流行格式的图像加载和保存,HTML查看和打印等等。



wxWidgets is a C++ library that lets developers create applications for Windows, OS X, Linux and UNIX on 32-bit and 64-bit architectures as well as several mobile platforms including Windows Mobile, iPhone SDK and embedded GTK+. It has popular language bindings for Python, Perl, Ruby and many other languages. Unlike other cross-platform toolkits, wxWidgets gives its applications a truly native look and feel because it uses the platform's native API rather than emulating the GUI. It's also extensive, free, open-source and mature.

wxWidgets在最开始是由爱丁堡(Edinburgh)大学的人工智能应用学院开发的,主要是内部使用,而在1992年第一次公布。并且由Julian Smart, Robert Roebling, Vadim Zeitlin, Vaclav Slavik和更多其他的人所编写和维护,最初以 wxWindows 的名字启动,并于 2004 年更名为 wxWidgets,以回应微软的商标要求。其主体是由C++构建的,但你并不是必需通过掌握C++语言才能使用wxWidgets。它拥有许多其它语言的绑定(Binding),可在使用其它语言编写程序的时候来调用wxWidgets。

wxwidgets是一个C++编写的用来提供Gui开发的框架。它包含一个可以支持现今几乎所有操作系统(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库和其他一些很有用的工具,提供了类似MFC的功能。特别要说一下,这个C++ Lib还的新版本还提供了对掌上电脑的支持。当然,说到这里很多人会想到java对多系统的支持,其实这是不一样的,java的跨平台是建立在“中间代码”的基础上的,就是说需要在目标平台上 安装java解释器;但是wxwidgets是c++库,经过编译后,其提供的是原生(native)级的机器码,在Gui编程方面,这可是意味着很大的不同!


功能和特点
wxWidgets有数百个类,涵盖了许多应用程序开发领域,我们无法在此简短文档中充分总结。GUI组件范围从简单的按钮组件到HTML列表框;从基本消息框到打印预览窗口。其他领域包括:
使用Sizers的窗口布局
设备上下文(以及笔,刷子和字体)
全面的事件处理系统
HTML帮助查看器
声音和视频播放
Unicode和国际化支持
文档/查看体系结构
打印架构支持
Sockets网络开发支持
文件和目录操纵
在线和上下文敏感的帮助
HTML渲染
多线程与基本容器
图像加载,保存,绘图和操纵
日期时间库和计时器
错误处理
剪贴板和拖放

通过浏览参考手册以了解支持功能很有帮助,其参考手册有可能是所有开源桌面GUI框架中最完善的。

当前支持以下平台:
wxGTK:使用GTK+ 2.6版或更高版本的Linux和其他UNIX变体的推荐端口。
wxMSW:32位和64位Windows变体的端口,包括Windows XP,Vista,7、8和10。
wxOSX/Cocoa:用于在MACOS 10.10及更高版本上提供基于Cocoa的应用程序。
wxQT:wxQT是使用QT库的wxWidgets的端口。它需要QT 5或更高版本。
wxX11:Linux和Unix变体的端口使用通用小部件集定位X11。
wxMOTIF:使用OpenMotif或LessTif小部件集的Linux和Unix变体的端口。

此外,当前稳定的3.0版本也支持以下列出的旧平台:
wxMSW:旧版32位Windows版本,例如Windows 95,Windows 98,Windows 2000
wxMAC:用于在Mac OS X 10.2至10.6上提供Carbon应用
wxOSX/Carbon:用于在Mac OS X 10.5及更高版本上提供基于Carbon的32位应用


那么wxwidgets有什么特别之处呢,比起其他的跨平台Gui库有什么优点呢?

1、(不得不放在第一位的)就是它无论对于个人还是对于商业应用都免费!
——它的主体框架的授权协议支持商业免费应用,其外围功能库中很多也是LGPL授权的,这无疑对于“零资本”的人来说是天大的好事。不同于Qt之类的跨平台Gui库那样附带复杂的商业授权。

2、跨平台的Gui库,支持的操作系统很全面,甚至支持Pda。
——此跨平台非彼跨平台,它虽然不像java那样是“全面”的,而仅仅是gui库,但是gui是计算机编程中,最为麻烦、耗费时间、容易出现bug的部分,特别当想要自己的软件运行在多个操作系统上的时候,开发和维护的难度让人难以想象。其实c++也是支持“跨平台”的,因为c++可以在任何平台上编译运行,之所以没几个人说他是跨平台的,主要问题就出在变量长度和各操作系统的gui(这里的“界面”我指得是很广义的)上,如果解决了gui的问题,基本上就解决了c++的“跨平台”问题——至少不用为每种平台都维护一份源代码了。

3、wxwidgets提供的Gui是大量使用宏的,这就意味着它是在尽可能的使用目标系统native的gui样式。
——可以访问wxwidgets网站,看看那些开发的软件的截图,全是系统native级别的。如果你开发了一个xp系统的软件的话,你的软件会仍然以“xp专有级别”的面貌展现在你面前。

4、它支持的编译器也很多,而且borland也曾声明将在c++ builderx2里边提供对wxidgets的支持——预览版都出来了。
——其实我就是看到borland在c++不景气的时候,这么看重这个东东,甚至用它来做“王牌”,才开始注意到他的。当然也正是borland的支持,才使他活力大发的。

5、有优秀支持且是开源的,wxwidgets一直都在快速稳健的开发中,其周边工具也越来越多。
——随着m$开始全力支持他的.net,c++成了“没落”的语言,但是不可否认,c++还是有很多用武之地的,所以根本不可能真正没落。没有了优秀的支持,地球人自然开始寻求新的发展方式,wxwidgets这种开源免费,且允许商业应用的好东东,自然会被人们所重视。

当然wxwidgets也有一些不足,比如官方文档不全(至少我觉得个官方的help远远不够需求,大部分都是网络上零散的教程),特别是没有源代码的开发速度快;没有强大全面的rad工具;还没有形成很浓的产业气候等等。但个人觉得它的好处绝对大于它的缺点,而且很有发展前途。许多流行的应用程序如BitTorrent、FileZilla和 aMule都是用wxWidgets开发的。

wxWidgets许可证

wxWidgets库是根据wxWindows许可证分配的,该许可证基于L-GPL,但具有例外条款。例外条款允许您在不需要公开您自己的应用程序的源代码的情况下,动态或静态地将应用程序链接到wxWidgets。换言之,可以免费使用wxWidgets进行免费或商业项目。许可证鼓励您回馈wxWidgets库本身的增强功能。

谁在使用wxWidgets

世界各地的许多组织和个人都在使用wxWidgets。它就像在家用的一种消费产品,销售了数十万份,就像wxWigets在大学或开源项目中一样。它已用于帮助公司创建前沿芯片,帮助钻探石油,控制无飞机飞机以及测试太空望远镜的组件。许多公司都依赖wxWidgets以及它给他们带来的跨平台优势。一些使用wxWidgets的知名组织,包括:AOL,AMD,Lockheed Martin,Xerox,NASA和开源应用程序基金会(OSAF)。可能熟悉的wxWidgets应用程序,包括:AVG防病毒,Forte代理,Audacity,Filezilla,iPodder和Tortoise CVS。很难知道有多少个开发人员在使用wxWidgets,但是只在一个非常活跃的wxWidgets社区,仅公告板上就有1,800多个订户。

使用wxWidgets的好处(接上文):
节省开发成本:一次编写代码,程序将可以在Windows,Unix,MacOS和其他平台上运行。
客户满意度提高:可以提供本地外观和感觉的稳定,快速,有吸引力的应用程序。
生产率提高:wxWidgets提供的各种类,既可以创造出色的GUI和一般应用开发。
由于对您以前可能没有考虑过的平台的支持以及国际化应用程序的能力,因此增加了市场份额。
大型活跃的wxWidgets社区的支持,该社区有助于回答问题,并提供提示错误。
可以随时查看wxWidgets源代码,从未快速增强功能和排查错误。

如何使用C++学习wxWidgets
下载wxWidgets时将获得3,000页参考手册以及大约80个示例和演示。这提供了大量信息来帮助您入门,但是朱利安·斯玛特(Julian Smart)、凯文·霍克(Kevin Hock)、Stefan Csomor的书籍的《wxWidgets跨平台GUI编程》也是非常宝贵的资源。随附的CD上的对话框编辑器将帮助您掌握Sizers使用方法,Sizers这是一种灵活的布局机制。


最新版本:3.0
上一个重大更新版wxWidgets 2.0还是在1998年发布的。3.0版的主要特性包括:彻底改进Unicode支持;基于Cocoa的OS X移植;wxGTK3移植,支持Broadway (HTML5)后端;访问原生Web渲染引擎;改进调试支持,修复大量bug,等等。

最新版本:3.2
从上一个 wxWidgets 稳定版系列开始,经过近 9 年的时间,新的稳定版 3.2 系列的第一个版本终于于2022年7月上旬发布。这个版本是自上一个稳定的 3.0 版本以来多年发展的结晶,它包含了来自 400 多位贡献者的 15000 多个提交,这个版本的主要变化包括:
构建系统的改进:支持新的编译器(MSVS 2022、g++ 12、clang 14),用更简单的方式使用 wxWidgets,以及一个全新的 CMake 构建系统
支持 macOS 10.14 及更高版本下的原生黑暗模式,已支持 ARM 硬件和 macOS 13 版本
通过基于 wxBitmapBundle 的新的、但几乎完全向后兼容的 API 支持高 DPI
为所有新的和一些现有的类提供新的 XRC 处理程序
显著改进了:wxBusyInfo、wxDataViewCtrl、wxDirDialog、wxGrid、wxNotificationMessage、wxSpinCtrl、wxStaticBox、wxStyledTextCtrl 和 wxUIActionSimulator
改善了编译时的安全性,可以禁用 wxString 和 char* 字符串之间危险的隐式转换
所有捆绑的第三方库的最新版本,包括所有的安全修复以及在 Unix 下对 WebKit 2 和 GStreamer 1.7 的支持
wxGTK 中更好的 Wayland 支持
修改后的 OpenGL 支持更适合现代 OpenGL(3.2+)
进一步改进了 C++11 及以后的支持,wxWidgets 可以使用 C++20 编译器构建
新的实验性 wxQt 端口
许多错误的修复
尽管有了上述这些变化,但 wxWidgets 3.2 几乎与 3.0 完全兼容
更多详情可查看此处


官方主页:http://www.wxwidgets.org/