【wxWidgets教程】前言:wxWidgets深度解析

本文将对wxWidgets进行全面深度介绍,旨在向您推荐这个卓越而低调的C++跨平台GUI框架。wxWidgets教程完整目录

wxWidgets设计优雅,界面美观,灵活简便,性能卓越。有微软MFC之遗风,但更彰显面向对象的设计理念;像Java Swing一样典雅,但性能更好,效率更高,干练更胜一筹;与Qt相比,同样风姿卓绝,但更显体态轻盈,用意专一。笔者初见也,欣喜若狂,视若珍宝以为不可多得。尽管由于市场运营和宣传不充分等原因,wxWidgets存在文档资料少、流行度不高等不足,但这些难掩其卓越而不张扬的内在品质以及难以估计的工程价值不可限量的发展前景。 

一、wxWidgets概况

       

wxWidgets是一个免费开源、设计优雅、功能丰富、性能卓越的跨平台C++图形界面(GUI:Graphic User Interface)框架,它封装了Linux、Mac和Windows等现今几乎所有操作系统界面开发接口,提供了对掌上电脑、移动设备和嵌入式设备的支持,允许在C++和其他语言中编写具有本地外观的跨平台GUI应用程序。这种跨平台特性的实现机制与Java语言不同,Java的跨平台性是基于“中间代码”和Java虚拟机解释实现,而wxWidgets直接编译成本地机器指令。因此它是高性能的,几乎与使用本机API同样快。

wxWidgets最初由爱丁堡大学人工智能应用研究Julian Smart开发,供内部使用。1992年首次创立,最初是一个用于创建在Unix和Windows上的可移植应用程序的项目。1999年发布了一个很大改进的版本2.0。2013年发布版本3.0,2022年发布了版本3.2。与Qt相比,wxWidgets在版本演进上更加丝滑,更注重向后兼容,不会因为版本升级而对API接口、开发方式、使用习惯等带来难以理解的“革命性”变化。目前wxWidgets由Julian Smart、Vadim Zeitlin、Stefan Csomor、Robert Roebling、Vaclav Slavik和许多其他人开发和维护。为该项目做出贡献的开发人员数量有数百人。

wxWidgets同时也拥有庞大的用户群,AOL、AMD、Lockheed Martin、Xerox、NASA和开源应用基金会(OSAF)等知名组织和不计其数的自由开发者都在使用使用它。目前已经被用于辅助公司设计前沿芯片,帮助钻探石油,控制无人机以及网络安全防护等。CodeBlocks、Filezilla、Audacity、iPodder、pgAdmin III和Tortoise CVS等流行软件都是基于wxWidgets开发的典型代表。

wxWidgets主体虽然由C++构建,但也提供了许多其它语言的接口,允许您在除C++之外的语言中轻松使用wxWidgets的GUI功能,包括wxPython、wxPerl、wxBasic、wxLua、wxJavaScript、wxJava、wx4j、wxRuby、wxEiffel、wxHaskell、wxEuphoria、wxAda等。

 与其他GUI框架相比,wxWidgets具有如下特点:

1、跨平台C++GUI

wxWidgets是目前唯一通过封装本地GUI小部件的C++ GUI库,它在每个平台上都能获得最好的用户体验。

在这里提到“跨平台”不像java那样“全面而彻底”,更不能做到一次编译到处运行。wxWidgets的跨平台仅指GUI方面。尽管如此,也已经算是解决了C++跨平台问题中最大的一个难题。GUI是计算机编程中最为繁琐、耗费时间、容易出现Bug的部分,特别是当你想要把自己的软件运行在多个操作系统上的时候,开发和维护的难度与工作量让人难以想象。其实,C++语言本身是支持跨平台的,能够做到代码级的可移植,因为它可以在任何平台上编译运行,之所以没几个人说他是跨平台的,主要问题就在于变量长度因平台而异且各操作系统的GUI使用大相径庭,因此,从某种意义上,解决了C++ GUI跨平台问题就基本上算是解决了C++跨平台问题的最主要方面。

2、遵循C++标准

wxWidgets完全遵循C++标准构建,不依赖于任何自定义扩展或预处理,也没有任何独立于C++标准之外的特殊语法、关键字等语言元素。同类GUI框架Qt因使用了许多非C++标准的语法而备受开发者诟病。事实上,在wxWidgets中,一以贯之的做法是:凡是能够用C++标准库完成的工作,都不会另起炉灶,部分因为历史原因与C++有重合的功能,wxWidgets都强烈建议使用C++的功能并会在后续版本中逐步取消其中重合的部分。wxWidgets用意专一,是标准C++的忠实追随者和坚定的维护者。

3、良好的面向对象设计

C++是对C语言的扩展,支持面向对象编程(OOP:Object Oriented Programming)的C++在很多时侯受C语言结构化程序设计(SP:Structured Programming)惯性的影响,开发者编写的OOP程序中总是能够看到SP的痕迹,Windows自带的GUI框架MFC就是一个典型的例子,消息与过程并存,对象与函数交织,这使得MFC变得晦涩难解且不易驾驭而成为公认的学习成本最高的开发技术之一。wxWidgets在设计时很好地坚持了面向对象的设计原则,体现了对象化的设计思想,每一个窗体都被精心设计成一个自治的对象,对象之间通过消息和事件相互通信,非常类似纯对象化语言Java的GUI框架Swing。与MFC、OWL、VCL、ATL框架相比,wxWidgets结构更加清晰,使用更加方便,代码的可读性可理解性更好,极大地节省了学习成本,缩短了开发周期。

4、后向兼容

wxWidgets所支持的许多平台都在不断发展,而wxWidgets现在支持的一些新平台在几年前甚至都是难以想象的。因此,wxWidgets也必须不断发展,以支持这些新特性和新平台。

然而,wxWidgets在许多平台上提供了一套始终如一的编程接口,这种始终如一不仅体现在横向这个维度,同时在纵向这个维度上也做到了前后衔接,平滑过度。当您把在Qt4.8上编译通过的代码重新用Qt5.0编译时,你会看到一大堆因API接口不兼容而导致的编译错误,那时,您才能真正体会到wxWidgets的难能可贵之处。它更像一个秉持中庸之道的儒者,以俯仰天地的气度和从容不迫定力,在日新月异的技术环境中,为开发者提供了一个随着时间推移依然岿然不动的API接口,以帮助和保护其用户不受未来某些不确定性的影响。

5、免费开源

wxWidgets的主体框架授权协议遵循宽通用公共许可协议(L-GPL:Lesser General Pubpc License),基于LGPL的软件允许商业化销售,但不允许封闭源代码。但wxWidgets在此基础上又增加了例外条款,即允许您在不需要公开你自己代码的前提下将应用程序动态或静态地链接到wxWidgets。因此,您可以在任何免费或商业的项目中自由使用wxWidgets,而不用担心有版权与产权纠纷问题,在知识产权越发受人重视的今天,这一特性显得尤其重要。

6、多编译器支持

wxWidgets可以使用多种编译器构建,包括gcc、Visual Studio、MinGW,MSYS2 MinGW-w64、CLang、Borland C++ Builder、TDM-GCC等。

7、多语言支持

wxWidgets基于C++构建,但并非C++专用。它还可以用于十几种其他语言,包括Python、Perl、Ruby、Lua、Haskell、D、Erlang、PHP等。

二、体系结构

    wxWidgets采用分层结构,自下而上分为操作系统层、平台API层、端口适配层、wxWidgets API层。

    图1 wxWidgets体系结构

    1wxWidgets API

    wxWidgets定义了一套体系化的通用API集。API的主体部分是窗体、对话框、控件、打印、字体、颜色等相关的GUI接口,除此之外也包括网络、多媒体、多线程、内存管理、文件系统、数据结构等API。这些API都可以在不同的平台下编写并编译运行,具有良好的跨平台性。

    2、端口

    wxWidgets的通用API集,使得应用程序代码可以在不修改或者修改不大的情况下方便地移植到各类操作系统。与JVM不同的是,wxWidgets并没有使用虚拟机或中间指令等技术来实现跨平台性,而是直接调用本地GUI接口实现,这也是wxWidgets能够在不同的平台上提供最佳界面效果的原因。

    因此,在wxWidgets API与本地GUI接口之间,需要有一个适配层,用于将wxWidgets API“翻译”到本地GUI,完成这项工作的模块就是“端口”。从设计模式的角度来讲,wxWidgets的端口是上层用户API与本地GUI之间的适配器;从面向对象设计的角度来看,wxWidgets API与wxWidgets端口之间更像是接口与实现的关系。不同的平台需要不同的端口。

    目前wxWidgets已经实现的端口有wxMSG、wxGTK、wxOSX/Cocoa、wxQt、wxiOS、wxX11、wxMotif等,其中:wxMSW是Microsoft Windows系统的本机端口;wxGTK有wxGTK2和wxGTK3两个版本,这两个端口几乎可以在任何Unix系统(Linux、FreeBSD、OpenBSD、NetBSD、Solaris、AIX,…)上工作;wxOSX/Cocoa是苹果电脑的主要端口,取代了旧的、现在已被弃用的wxOSX/Carbon端口。

    三、库列表

    自从2.5.0开始,wxWidgets既可以编译成单一的代码库(monolithic),或者编译为一些多个小的代码库(multilib),Multilib是默认的编译方式,下图显示了各个库之间的依赖关系。

            备注:该图来自wxWidgets官方文档

    图 2 wxWidgets库依赖关系

    箭头表示“依赖于”,蓝色库都依赖于wxBase库(它们是非GUI库),所有绿色库都依赖于wxCore库(它们是GUI库)

    1wxAui

    包含高级用户界面中的具有停靠功能的控件。

    2wxBase

    每个wxWidgets应用程序都需要链接到此库。它包含任何wxWidgets代码所依赖的基础类(例如wxString)和屏幕了平台间差异的可移植类。wxBase可用于开发控制台模式的应用程序,它不需要任何GUI库或在Unix上运行X窗口系统。

    3wxCore

    包含基本的GUI类,如GDI类和控件类都位于这个库中。所有wxWidgets GUI应用程序都需要链接到此库。

    4wxGL

    这个库包含用于集成OpenGL库和wxWidgets的wxGLCanvas类。与其他库不同,无论采用monolithic还是multilib方式编译,这个库总是作为单独的库来构建。

    5wxHTML

    简单的HTML渲染程序和其他wxHTML控件如wxHtmlHelpController、wxBestHelpController和wxHtmlListBox等位于这个库中。

    6wxMedia

    包含与多媒体有关的类。目前这个库只包含wxMediaCtrl,但将来会添加更多的类。

    7wxNet

    包含网络访问类。如wxSocket类(wxSocketClient、wxSocketServer和相关类)、wxSocketOutputStream和wxSocketInputStream、基于套接字的IPC类(wxTCPServer、wxTCPClient和wxTCPConnection)、wxURL、wxFileSystem处理例程等。

    8wxPropertyGrid

    包含wxPropertyGrid控件相关类。

    9wxQA

    这是包含额外的质量保证类的库。目前它只包含wxDebugReport和相关类,但将来还会添加更多的类。

    10wxRibbon

    其中包含Ribbon用户界面组件相关类。

    11wxRichText

    包含通用的富文本控件相关类。

    12wxSTC

    STC(Styled Text Control)是Scintilla的封装器,它是一个语法突出显示的文本编辑器。

    13wxWebView

    包含wxWebView控件及其关联的类。

    14wxXML

    包含用于分析XML文档的相关类。

    15wxXRC

    包含wxXmlResource相关类,它提供对XRC格式的XML资源文件的访问。

    四、网络资源

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

            邮件列表:http://lists.wxwidgets.org

            官方wiki:http://wiki.wxwidgets.org

            论坛:http://www.wxforum.org

            wxCode:https://wxcode.sourceforge.net/

    五、版权相关

            本书所引用大部分图片、源码和示例代码均来自wxWidgets官方网站,部分原理性阐述直接翻译自wxWidgets官方技术文档。

            wxWidgets源码和示例代码遵循L-GPL协议,允许自由使用。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    万法若空

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值