1 体系结构
wxWidgets的体系结构下图所示。wxWidgets的体系结构可以分为4层:wxWidgets公共API层,各个平台Port,用于各个平台的API以及操作系统。
2 Libraries 列表
从版本 2.5.0以后,wxWidgets既可以编译成单一的一个大的ibrary(monolithic build),也可以编译成几个小的 libraries(multilib build)。WxWidgets默认的是编译成multilib build。
下图列出了wxWidgets libraries以及他们之间的依赖关系。
1)wxAui
包含着高级用户界面 docking library。
2) wxBase
所有wxWidgets程序都必须链接本 library。包含了许多数据结构类以及其他公共基类(如wxString,wxWindowbase等)。抽象了平台间的不同。wxBase 可以用来开发控制台程序,不需要任何GUI libraries。
3) wxNet
网络开发有关类:
wxSocket 类 (wxSocketClient, wxSocketServer 以及其他相关类)
wxSocketOutputStream 和 wxSocketInputStream
sockets-based IPC 类 (wxTCPServer, wxTCPClient and wxTCPConnection)
wxURL
wxInternetFSHandler (a wxFileSystem handler)。
4) wxRichText
通用 rich text 控件。
5) WxXML
包含解析XML文档的类。不建议使用。将来的版本将包含新的XML处理类,包含类似DOM的API。
6) wxCore
基本GUI类,如 GDI类或控件。所有wxWidgets GUI 应用程序必须引用本库。
7) wxAdvanced
高级或是不常用的GUI类。
wxBufferedDC
wxCalendarCtrl
wxGrid classes
wxJoystick
wxLayoutAlgorithm
wxSplashScreen
wxTaskBarIcon
wxSound
wxWizard
wxSashLayoutWindow
wxSashWindow
8) wxMedia
多媒体类。目前仅包括wxMediaCtrl ,将来将加入更多的类。
9) wxGL
包含wxGLCanvas 集成OpenGL library。与其他类不同的是,本library不是 monolithic library的一部分,而是总是编译成一个独立的library。
10) wxHTML
HTML renderer及其相关类。
11 )wxODBC
数据库类。
12 )wxQA
质量保证类库。目前仅有 wxDebugReport 以及相关类。
13 )wxDbGrid
wxDbGridTableBase 类组合了 wxGrid and wxDbTable。
14 )wxXRC
包含wxXmlResource类,读取XRC 格式的XML资源文件。
3 内部代码组织结构
如图,是wxWidgets源代码组织结构,大体可以分为六层:
1 )通用代码部分(位于common目录内)。被所有的版本使用,包括数据结构,运行期类型信息,一些被其他类继承的基类,如wxWindowBase等。
2) 一般代码部分(位于generic目录内)。实现与平台无关的高级 widgets。如 wxWizard 和wxCalendarCtrl等。
3) wxUniversal部分(位于univ目录内)。基本窗口控件类,可以用于不提供本地窗口控件的平台如X11和MGL使用。
4 )平台相关代码(位于gtk、msw等目录内)。使用本地API实现类。
5 )外来代码部分,放在一个单独的目录结构中(contrib目录,本图没有列出,位于上一级目录)。
6)第三方代码(位于jpeg,png,regex,zlib等目录中),这些都是独立于wxWidgets的项目,但是wxWidgets使用来实现许多重要的功能。
wxWidgets libraries 和内部代码组织具有交叉关系。如wxNet库里既包含通用代码又包括平台相关代码部分,其他的库又可能包括一般代码部分。
4 类继承关系
如图,列举了wxBase和wxCore中部分类的继承关系。
其中wxObject是其他绝大部分类的基础,是万类之首。凡派生于wxObject的类,得以继承数个面向对象的重要特性,包括RTTI(执行期类型识别),Dynamic Creation(动态生成)等。
其中wxWindowGTK和wxTopLevelWindowGTK是于平台有关的类,源码位于gtk目录下。Window下对应的类是wxWindowMSW和wxTopLevelWindowMSW,位于msw目录下。当编译代码时,wxWidgets怎么知道编译哪一个类呢?主要是wxWidgets通过不同的宏定义来实现的:
在app.h中,你可以发现以下代码:
类似的在window.h中,你可以发现:
通过指定不同的编译开关,可以编译出平台相关的类库。
参考文献
《Cross-Platform GUI Programming with wxWidgets》,Julian Smart and Kevin Hock with Stefan Csomor.
《wxWidgets 2.8.9: A portable C++ and Python GUI toolkit》,Julian Smart, Robert Roebling, Vadim Zeitlin, Robin Dunn, et al
http://hi.baidu.com/zshua_404/blog/item/a10155393d4c3623b8998feb.html