返回介绍

1.5 wxWidgets 的体系结构

发布于 2025-03-08 15:26:40 字数 4461 浏览 0 评论 0 收藏 0

下表展示的 wxWidgets 的四层体系结构: wxWidgets 公用 API 层,各个平台发行版,用于各个平台的 API 和操作系统层。

wxWidgets API         
wxWidgets PortwxMSWwxGTKwxX11wxMotifwxMacwxCocoawxOS2wxPalmOSwxMGL
Platform APIWin32GTK+XlibMotif/LesstifCarbonCocoaPMPalm OS Protein APIsMGL
Operating SystemWindows/Windows CEUnix/Linux  Mac OS 9/ Mac OS XMac OS XOS/2Palm OSUnix/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 层:

  1. 通用代码被所有的版本使用,包括类的数据结构,运行期类型信息,和一些公共基类比如 wxWindowBase 等,这些基类的代码将被所有它的子类所继承。
  2. 一般代码用来实现独立于各个平台的高级窗口控件,在某个平台不具有某种控件的时候将使用这部分代码,比如 wxWizard 和 wxCalendarCtrl。
  3. 通用组件基本的窗口控件集,这套控件可以在某个平台(比如 X11 或者 MGL)不具有它自己的窗口控件的时候使用。
  4. 平台相关代码调用特定平台的 API 来实现某个类的代码。比如在 wxMSW 中的 wxTextCtrl 控件的实现是封装了 Win32 的 edit 控件。
  5. 外来代码存放在一个单独的 contrib 目录中,提供一些非必要但是很有用的类实现。比如 wxStyledTextCtrl
  6. 第三方代码不是由 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文