与所有的现代GUI框架类似,wxWidgets利用面向对象编程的概念获得了许多好处。每一个窗口对应了一个C++对象;这些对象具有良好定义的行为,能够接收事件并作出响应。用户们能看到的只是这个对象交互系统的视觉效果。你作为开发人员的工作就是指挥这些对象的行为,wxWidgets已经缺省实现了许多行为,更是大大简化了你的工作。
当然,毫无coincidence,面向对象编程和GUImesh得很好,他们是一起发展起来的。由Alan
Kay设计的Smalltalk和其它70年代的面向对象语言在GUI的历史中是一个重要的里程碑,在用户界面技术和语言设计上都有创新。虽然wxWidgets使用了另外一种语言和一套API,但其根本原则还是相同的。
版权考虑
wxWidgets许可(由于法律和历史的原因,官方的名称叫wxWindows许可)是一个L-GPL许可,除了一点例外。你可以在网站上找到详细的许可证的内容,也可以在发行版的docs目录中找到,但是总的来说,你可以在商业软件或者免费软件中使用wxWidgets,无须交纳任何税f费。你可以静态或者动态地链接wxWidgets的库。如果你修改了wxWidgets的源码,你必须能让别人免费获取这些修改。你不必公开你自己的代码和目标文件。另外,请仔细阅读随wxWidgets发行的其它库文件的许可,例如PNG和JPEG库等。
随本书提供的源码同样遵从wxWindows许可。
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
以下是写作本书时已经存在的主要的wxWidgets移植版本。
wxMSW
该版本能在Microsft
Windows的所有32位和64位系统中编译和运行,包括Windows
95,Windows 98,Windows ME,Windows NT,Windows 2000,Windows
XP和Windows
2003。同时,也可以编译成使用Linux写Winelib的方式,还有能够工作在Windows
CE上的配置。wxMSW中也可以配置成使用wxUniversal的组件,而不是使用Win32的控件。
wxGTK
wxWidgets的GTK+版本在任何支持X11和GTK+的Unix变种(例如,Linux,Solaris,HP-UX,IRIX,FreeBSD,OpenBSD,AIX等等)上使用1.x或2.x版本的GTK+组件集。只要有足够的资源,wxGTK也可以运行在嵌入式平台上,例如GPE
Palmtop环境。、wxGTK是基于Unix系统的推荐版本。
wxX11
wxWidgets的X11版本使用wxUniversal组件集,直接运行在Xlib上,不需要原生组件。这使得该版本适合在嵌入式系统中使用,当然也可以在不想链接GTK+的桌面应用程序中使用。所有运行X11的Unix系统都支持这个版本,但wxX11不像wxGTK那样成熟。
wxMotif
该版本使用在大部分Unix系统上使用Motif,OpenMotif或者Lesstif。Sun
Microsystems中使用了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,也可以使用Apple提供的工具。当使用Apple的工具时,你应该使用Xcode
1.5或者更高的版本,或者你可以使用命令行工具-GCC
3.3或者更高的版本。
wxCocoa
一个仍在开发中的版本,针对Mac OS X的Cocoa
API。虽然Carbon和Cocoa的功能类似,但这个版本具有支持在Mac之外的平台上运行的GNUStep的能力。
wxWinCE
Windows CE版本包含了基于Windows
CE平台的几种SDK,包括Pocket
PC和Smartphone等。本版本中包含了经过修改和删减的wxMSW
Win32的版本。wxWidgets完成了针对这个有许多限制的平台的用户界面的适应工作,包括使用嵌套菜单而不是常规的菜单条,因为Smartphone只支持两个菜单按钮。还有一些其它需要注意的地方,例如在对话框中不是使用确定和取消按钮,而是调用SetLeftMenu和SetRightMenu。
wxPalmOS
这是一个针对Palm OS
6(Cobalt)的版本。在写作本书时,该版本还在初生期,但可以在Palm
OS 6上编译和运行一个简单的例子。
wxOS2
wxOS2是一个针对OS/2或者eComStation的Presentation
Manager的移植版本。
wxMGL
此版本针对来自ScieTch软件公司的较低的图形层MGL,使用wxUniversal组件集。
内部组织
在wxWidgets的内部,代码分成了六个层面:
所有版本中使用的共用代码,包含数据结构类,运行时类型信息和基础类,例如wxWindowBase,它用于所有的类实现中。
一般代码,实现了独立于平台的高级组件,模拟指定平台上没有的控件和功能。wxWizard和wxCalendarCtrl就是一般控件的例子。
wxUniversal是一组用于自身没有组件实现的平台(例如裸的X11和MGL)的一组基本组件。
与平台相关的代码,实现了原生功能类。例如wxMSW中的wxTextCtrl实现就是包装类Win32的编辑控件。
贡献的代码,位于单独的名为contrib的目录中,里面包含了一些不是必须的但是非常有用的类,例如wxStyledTextCtrl。
第三方的代码,是独立于wxWidgets开发的,但在wxWidgets中起到了重要的作用,例如JPEG、Zlib、PNG和Expat库。
每一个版本从这些层面中各取所需实现了wxWidgets API。
当你编译你的程序时wxWidgets怎么知道应该使用哪些类呢?当你包含了头文件,例如wx/textctrl.h,根据wx/textctrl.h中的指示条件包含了合适的声明,你实际上包含了一个与平台相关的文件,例如wx/mxw/textctrl.h。然后你的程序将链接根据要求和合适的设置编译出来的而库文件。你可以一次拥有几种不同的配置,尤其时调试版本和发行版本,并且你还可以静态或者动态地链接wxWidgets的代码。只要你想,你还可以通过编辑文件setup.h或者使用依赖于编译器的配置选项来禁止wxWdigets中的某些组件,或者选择使用Unicode还是ANSI。具体的信息请查阅附录A"安装wxWidgets"。
注意,wxWidgets是一层对原生API的包装,你还是可以直接使用原生的API编写与平台相关的代码,虽然这种情况很少见。
小节
在本章中,我们知道了wxWidgets是什么,介绍了它的一点历史,概述了各个移植版本,并简述了内部组织结构。
在下一章中"入门"中,我们将看到一些例子代码,并感受如何编写wxWidgets应用程序。