陶朱子
(文章原创,引用请注明出处)
学习了一段时间wxWidgets,感觉这个东西还是挺有意思,据说wxWidgets的相关资料不太多,在现有的一些资料基础上,把我的一些学习成果写出来,请大家指正。我还是不能免俗,这次先来个简介。
一、什么是wxWidgets?
是一个能为多个平台提供GUI和其它软件工具开发接口的C++框架开发包,主要用于跨平台应用程序开发;通过类库的方式提供一个框架,封装了许多底层工作,类的方法可为应用程序及控件提供默认行为,可通过重载的方式定制所需要的行为。
目前最新的稳定版本为3.0.2,能支持所有主流桌面OS。
二、选择wxWidgets的原因
wxWidgets是跨平台的,好处有:
(1)wxWidgets提供的调用函数在它所支持的所有平台上都是相同的或至少是非常相近的,这意味着换平台时改动很小,只需经过重新编译,就可以新平台上运行;
(2)wxWidgets可让应用程序和当前平台上其他应用有非常相似的外观和操控方式,由于它尽可能地使用本地的窗口控件,实际上就是原生程序,这比JAVA使用虚拟机的方式来实现跨平台要高效;(它是唯一的通过封装本地GUI窗口实现在每种平台上都有最好用户体验的C++GUi库);
(3)只使用标准C++编写,而不依赖于任何其它自定义扩展或预处理方法;
(4)是开源的,对开源项目和商业项目来说,都是免费的。
一些特点:
当然,wxWidgets并不是适合所有的应用开发,比如OLE-intensive的程序。
三、wxWidgets和面向对象编程
wxWidgets大量使用了面向对象编程的概念,每个窗口都是一个C++对象,这些对象中被预置了事件处理机制和很多默认行为,可接收事件并对事件作出反应,对事件也可有很多的默认反应来处理。用户所能看到的只是这些机制中可视的部分,开发人员要合理安排这些可视的行为集,以使程序的反应更符合程序逻辑。
四、wxWidgets的体系结构
1、体系结构
wxWidgets公用API层,各个平台发行版、用于各个平台的API和操作系统层。如下图:
2、内部组织
wxWidgets内部分为6层:
(1)通用代码部分:被所有的版本使用,包括类的数据结构,运行期类型信息,和一些公共基类比如wxWindowBase等,这些基类的代码将被所有它的子类所继承。
(2)一般代码部分:用来实现独立于各个平台的高级窗口控件,在某个平台不具有某种控件的时候将使用这部分代码,比如wxWizard和wxCalendarCtrl。
(3)wxUniversal部分:基本的窗口控件集,这套控件可以在那些不具有本地窗口控件的平台(比如X11或者MGL)使用。
(4)平台相关代码:调用特定平台的API来实现某个类的代码。比如在wxMSW中的wxTextCtrl控件的实现是封装了Win32的edit控件。
(5)外来代码:存放在一个单独的contrib目录中,提供一些非必要但是很有用的类实现。比如wxStyledTextCtrl类。
(6)第三方代码:不是由wxWidgets开发维护但是被wxWidgets使用以提供一些很重要的特性的代码,比如JPEG,ZIib, PNG和Expat库。
每一个平台版本所需要作的事情就是提取它需要的那些层的代码,然后用它那个平台的底层的API来实现wxWidgets的API。
3、使用宏定义来针对平台进行编译
当编译代码的时候,wxWidgets怎么知道要编译哪一个平台的类呢?
这是通过宏定义实现的。当包含一个wxWidgets的头文件(比如wx/textctrl.h)的时候,由于使用了不同的宏定义,实际上包含的是一个特定平台的头文件(比如wx/msw/textctrl.h)。然后,当链接wxWidgets库文件的时候(当然这个库文件也需要是用同样的宏定义编译的),就可以同时拥有多套宏定义,例如可以有调试版本和发布版本两套宏定义。通过这些宏定义的不同,可以控制编译器链接wxWidgets的动态或者是静态版本,也可以禁止编译某个特定组件,或者是决定要编译的是Unicode版本还是ANSI版本。为了达到这个目的,需要修改setup.h或者增加不同的编译选项,这取决于你的编译器。
另外一点提示是:虽然wxWidgets封装了本地的平台相关API,并不意味着在wxWidgets程序中不可以使用这些API。只是,在绝大多数情况下,用不着使用这些API。
4、库信息
wxWidgets默认被构建成多个较小的库(称为multilibbuild:多lib库构建),也可构建成一个大的库(称为monolithic build:整体集成构建)。wxWidgets库被划分成如下图中的库,下图也显示了这些库则的依赖性。
注意:箭头表示“依赖”关系,所有的蓝色库依赖于wxBase库,它们是非GUI库;所有绿色库依赖于wxCore库,它们是GUI库。
重要库介绍:
wxBase:每个wxWidgets程序都必须与此库链接。此库包含一些每个wxWidgets代码都依赖的强制性的类,以及提取了平台间不同的可移植性的类。此库可用于开发控制台模式的程序,它不需要任何GUI库。
wxCore:基本的GUI库,比如GDI类或控制在此库中。所有的wxWidgetsGUI程序必须与此库链接,只有控制台程序不需。
五、相关工具
wxWidgets除了提供代码库,还为用户提供了一些工具,这些工具在utils文件夹中,
1、Emulator
在utils/emulator中,基于Xnest的显示仿真器,用于基于X11的PDA应用。
2、Help Viewer
在utils/helpview中,是一个用于显示wxWidgets的HTML帮助文件的程序,这个程序有源码,在使用wxWidgets的HTML Help类进行程序编写时,可以提供参考,可以到wxHTML的说明中找到更多的细节。
3、HHP2Cached
在utils/hhp2cached中,这个工具可创建一个“cached”版本的.hhp文件,在wxHtmlHelpController中使用这种文件能极大地提高Help Viewer的性能,可wxHtmlHelpController的说明中找到更多的细节。
4、Interface Checker
在utils/ifacecheck中,此工具能比较include中的wxWidgets的真实接口与用于文档目的wxWidgets接口,能对不一致(主要是错误的原型签名)进行警告,甚至自动地更正它们。它使用gccxml工具的XML输出工具和Doxygen工具来进行比较。此工具对wxWidgets编写文档和文档查看很需要。
5、ScreenshotGenerator
在utils/screenshotgen中,此工具能在wxWidgets的HTML文档编制中,自动对各种GUI组件进行屏幕快照处理。
6、wxWidgets XMLResource Compiler
在utils/wxrc中,此工具能让用户编译他们的XRC文件的二进制版本,这种版本是压缩的,能比普通的XRC文件载入更快。可以看看XML Based Resource System (XRC)这文章得到更多信息。