首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用 wxWidget 构建跨平台的 GUI (1)

用 wxWidget 构建跨平台的 GUI (1)

为什么要使用 wxWidgets 呢?原因很简单,它让您可以快速轻松地编写能够跨平台运行的 GUI,能让您随意选用编程语言,还能让您的 GUI 如下图所示一样优秀:
图 1. Chandler 电子邮件客户机图 1 显示了 Chandler,一个在开放源码应用程序基础上开发的日历和电子邮件管理程序。它是使用 wxWidgets 工具包编写的。虽然原始版本的 wxWidgets 是在 C++ 中实现的,Chandler 的创建者们却使用了 wxPython 工具包及 Python 作为包装程序来与 C++ 库进行无缝的交互。wxWidgets 工具包会尽可能地利用原生对象,这些对象通过在需要的地方使用强大的定制窗口小部件得以扩充。您可以编写能够运行在多种平台的 wxWidgets 程序,并且可以使用多种编程语言来实现。
开始使用 wxWidgets开始之前,我假定您已经到 wxWidgets 主页下载了所用平台的相关软件包。如果还没有,请参见 参考资料 部分的链接并下载它。我还进一步假定您已经掌握了将 wxWidgets 库与编译器或所选的集成开发环境(IDE)进行集成所需的命令和设置。如果还不是很明白,本文后面 参考资料 部分中有指向所需信息的相关链接。完成上述工作后,您就可以着重进行程序代码编写了。
wxWidgets 程序的主体包括两种主要的对象:应用程序对象和框架对象。可以有多个框架,而且在代码中还可能需要一些特定于 wxWidgets 的宏。以下解释了它们是如何组合在一起的。
链接到 wxWidgets 库要链接到 wxWidgets 库,必须先包括它。在头文件的顶部放上如下一行代码:
1
#include "wx/wx.h"




wx/wx.h 头文件包括所有可能需要的 wxWidgets 定义。如果十分关注于性能,则可以用一些针对将要用到的特定头文件的 include 语句来替代该文件。
定义应用程序类接下来,必须定义应用程序类。在很多简单的情况下,该类的作用不大,但是您必须有一个自己的类。wxWidgets 应用程序继承自 wxApp 类,其定义很简单:
1
2
3
4
class DemoApp : public wxApp {
public:
  virtual bool OnInit();
}




应用程序开始时,调用 OnInit() 函数 —— 实际上是 main() 方法。
定义了应用程序类之后,在代码中放上如下的宏:
1
IMPLEMENT_APP(DemoApp)




您可以用自己的应用程序类的名称来替代 DemoApp。这个宏创建 wxWidgets 所使用的真正的 main() 方法。另外,它还创建应用程序对象的一个实例并开始初始化过程。
定义框架类现在开始定义框架类,它代表应用程序中的主窗口。xWidgets 父类是 wxFrame。清单 1 给出了一个简单的示例。
清单 1. 示例 wxFrame 类
1
2
3
4
5
6
7
8
class DemoFrame : public wxFrame {
public:
   DemoFrame(const wxString& title);
   void OnButtonPress(wxCommandEvent& event);

private:
   DECLARE_EVENT_TABLE()
};




为了去除不太熟悉的名称,wxString 是一种特定于 wxWidgets 的字符串包装程序类,它在整个 wxWidgets 工具包中用于字符串操作。工具包拒绝标准模板库 (STL) 类的使用以避免将 wxWidgets 限制在 STL 可用的平台。如果需要,可以采用编译时间开关将 STL 用作底层实现。类似地,wxCommandEvent 是事件的一种父类 —— 具体来说是命令事件,是通常与用户操作(如单击按钮或从列表中选择)相关的高级事件。而 DECLARE_EVENT_TABLE 宏是任何需要对事件做出响应的 wxWidgets 对象(它无疑包括本文中的小演示框架)所必需的。
定义事件表要真正响应事件,必须在实现文件内定义事件表。它是另一种宏,在本文的示例中它如清单 2 所示。
清单 2. 事件表宏
1
2
3
BEGIN_EVENT_TABLE(DemoFrame, wxFrame)
   EVT_BUTTON(wxID_CLOSE,  DemoFrame::OnButtonPress)
END_EVENT_TABLE()




BEGIN_EVENT_TABLE() 宏有两个参数:事件表实际针对的类和此类的中间父类。如您所预期的一样,END_EVENT_TABLE 宏指出事件表的末尾。中间可以包含若干个特定的事件宏,本例中只有一个。
wxWidgets 工具包包含几个不同的事件宏,每个对应于不同的事件。在本例中,EVT_BUTTON   代表按钮单击。这个宏的第一个参数是指代正在处理的特定按钮的标识符。wxID_CLOSE 标识符是与应用程序的一些公共特性相关的几个预定义的标识符之一。这里使用预定义的标识符完全是为了方便,虽然在有些情况下,某些特定的标识符会触发 wxWidgets 系统的特别处理。第二个参数是在触发菜单事件时调用的方法的全限定名。您可以用类似于此处所描述的事件宏来管理 wxWidgets 中的所有事件。
返回列表