1.5 wxWidgets 的体系结构
下表展示的 wxWidgets 的四层体系结构: wxWidgets 公用 API 层,各个平台发行版,用于各个平台的 API 和操作系统层。
wxWidgets API | |||||||||
---|---|---|---|---|---|---|---|---|---|
wxWidgets Port | wxMSW | wxGTK | wxX11 | wxMotif | wxMac | wxCocoa | wxOS2 | wxPalmOS | wxMGL |
Platform API | Win32 | GTK+ | Xlib | Motif/Lesstif | Carbon | Cocoa | PM | Palm OS Protein APIs | MGL |
Operating System | Windows/Windows CE | Unix/Linux | Mac OS 9/ Mac OS X | Mac OS X | OS/2 | Palm OS | Unix/DOS |
下面依次说明目前已有的各个平台发行版本:
wxMSW
这个版本编译和运行在各个版本的微软的 Windows 操作系统上,包括:Windows95,Windows98,WinMe,Windows NT,Windows 2000,Windows Xp 以及 Windows 2003.在 linux 平台上,这个版本也可以使用 Wine 的库进行编译,并且可以被配置成在 WinCE 上运行。除了使用本地原生窗口控件,这个版本也可以配置成使用 wxWidgets 自己的窗口控件。
wxGTK
wxWidgets 的 GTK+版本可以使用 GTK 的 1.x 或者 2.x 版本,支持所有可以运行 X11 和 GTK 的类 Unix 平台 (比如: Linux, Solaris, HP-UX, IRIX, FreeBSD, OpenBSD, AIX 等). 它也可以运行在那些有足够资源的嵌入式平台,比如 GPE Palmtop 环境 (如下图所示). wxWidgets 的 GTK 版本是类 Unix 系统的推荐版本。
wxX11
wxWidgets 的 X11 版本使用了 wxUniversal 的窗口控件集,直接运行在 Xlib 上。这使得它很适合嵌入式系统,当然它也可以运行在那些不喜欢 GTK+的桌面系统上。它支持所有可以运行 X11 的 Unix 系统,当然 wxX11 并不像 wxGTK 那样完善。下图演示了 Life 程序使用 wxX11 版本编译运行在一个 iPAQ PDA 的类似 Linux/TinyX 环境下的样子。
wxMotif
这个版本的 wxWidgets 可以在大多数拥有 Motif, OpenMotif, 或者 Lesstif 的 Unix 系统上. 既然连 Sun 自己都正准备把它的窗口控件集转向 GNOME 和 GTK+,对于大多数开发者来说,Motif 并不是一个很可靠的选择。
wxMac
wxMac 是为 Mac OS 9 (9.1 以后的版本) 和 Mac OS X (10.2.8 以后的版本) 准备的. 如果在 Mac OS 9 上编译,你需要 Metrowerks CodeWarrior 的工具包,如果在 Mac OS X 上编译,你可以选择 Metrowerks CodeWarrior 工具包或者苹果公司的工具包. 如果使用苹果公司的工具包,你应该使用 Xcode 1.5 或者更高的版本,或者你可以考虑直接使用命令行工具 toolsGCC 3.3 或者其后续的版本。
wxCocoa
这是一个正在进行中的版本,它使用 Mac OS X 的 Cocoa API. 虽然 Carbon 和 Cocoa 的功能很相似,但是这个版本有可能会支持除 Mac 以外的其它支持 GNUStep 的操作系统。
wxWinCE
Windows CE 版本的 wxWidgets 封装了 WindowsCE 平台上的各种不同的开发包,包括 Pocket PC 和 Smartphone 等. 这个版本包含在 wxMSW 的 Win32 版本中。下面第一副图演示了 Life 程序在 Pocket PC 2003 模拟器上运行的样子。第二副图则演示了 wxWidgets 中的对话框例子运行在一个拥有四个屏幕,分辨率为 176x220 的 SmartPhone2003 上的样子。wxWidgets 作了大量的用户界面适配方面的工作,比如因为 Smartphone 只支持两个菜单按钮,所以在通常显示菜单的地方 wxWidgets 构建了可以折叠的菜单。尽管如此,一些地方仍然需要依靠编程者使用不同的代码,比如应该使用 SetLeftMenu 和 SetRightMenu 函数来代替直接在对话框上增加两个确定和取消按钮。
wxPalmOS
这个版本是为 Palm OS 6 准备的。到作者写这本书的时候为止,这个版本还处在很初级的阶段,但是已经可以在 Palm OS 6 的模拟器中运行一个很简单的小程序了。参见下图:
wxOS2
wxOS2 是一个由别人维护的用于 OS/2 或者 eComStation 的版本(is a Presentation Manager port for OS/2 or eComStation)。
wxMGL
这个版本使用了 SciTech 公司的底层图形库,窗口控件使用的是 wxUniversal 中的版本。
内部组织
在内部,wxWidgets 的代码大致分为 6 层:
- 通用代码被所有的版本使用,包括类的数据结构,运行期类型信息,和一些公共基类比如 wxWindowBase 等,这些基类的代码将被所有它的子类所继承。
- 一般代码用来实现独立于各个平台的高级窗口控件,在某个平台不具有某种控件的时候将使用这部分代码,比如 wxWizard 和 wxCalendarCtrl。
- 通用组件基本的窗口控件集,这套控件可以在某个平台(比如 X11 或者 MGL)不具有它自己的窗口控件的时候使用。
- 平台相关代码调用特定平台的 API 来实现某个类的代码。比如在 wxMSW 中的 wxTextCtrl 控件的实现是封装了 Win32 的 edit 控件。
- 外来代码存放在一个单独的 contrib 目录中,提供一些非必要但是很有用的类实现。比如 wxStyledTextCtrl
- 第三方代码不是由 wxWidgets 开发维护但是被 wxWidgets 使用以提供一些很重要的特性的代码,比如 JPEG, Zlib, PNG 和 Expat 库。
每一个平台版本所需要作的事情就是提取它需要的那些层的代码,然后用它那个平台的底层的 API 来实现 wxWidgets 的 API。
当你编译你的代码的时候,wxWidgets 怎么知道要编译哪一个平台的类呢?当你包含一个 wxWidgets 的头文件(比如 wx/textctrl.h)的时候,由于使用的不同的宏定义,实际上你包含的是一个特定平台的头文件(wx/msw/textctrl.h)。然后,当你链接 wxWidgets 的库文件的时候,当然这个库文件也需要是用同样的宏定义编译的。你可以同时拥有多套宏定义,例如你可以有调试版本和发布版本两套宏定义。通过这些宏定义的不同,你可以控制编译器链接 wxWidgets 的动态或者是静态版本,也可以禁止编译某个特定组件,或者是决定你要编译的是 Unicode 版本还是 ANSI 版本。为了达到这个目的,你需要修改 setup.h 或者增加不同的编译选项,这取决于你的编译器。有关这些问题更详细的描述,请参见附录 A,???安装 wxWidgets???
另外一点提示是:虽然 wxWidgets 封装了本地的平台相关的 API,并不意味着在你的 wxWidgets 程序中不可以使用这些 API。只是,在绝大多数情况下,你用不着使用这些 API。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论