WxWidgets框架应用及其模块化开发
2009-07-07张羽
张 羽
[摘要]wxWidgets是简单易用的跨平台程序开发包,它可以在多种操作系统上开发图形用户界面。深入研究wxWidgets的类库,包括它的基本特性、事件处理机制以及wxWidgets在软件模块化开发方面的应用。
[关键词]wxWidgets跨平台式模块化图形用户界面
中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)1120067-01
wxWidgets由Julian Smart于1992年在爱丁堡大学首先创建,随着wxWidgets的不断发展,适用的平台也越来越多。现在的wxWidgets已经不再是单纯的跨平台的GUI软件开发包,而是一个可以支持多种操作系统平台的能够在多种语言中使用的跨平台软件开发包。目前支持C++的其他软件开发包很多,比如MFC、QT、ACE等。MFC是微软提供的软件开发包,MFC只能在Windows平台下运行。QT和wxWidgets类似,但使用QT的商业版本,需要支付费用。ACE虽然是免费开源的,但没有GUI功能。
一、wxWidgets框架
wxWidgets是一个高品质应用程序类库,尽管它是开源的,但有人称其具有商业品质,它的用户包括了AOL,AMD,NASA等大的商业和团体机构。wxWidgets这款框架的优势是真正意义上的跨平台,wxWidgets提供了一套在多种平台上编写GUI程序的应用程序接口,wxWidgets提供的API函数在它支持的所有平台上都是相同的。wxWidgets给应用程序提供和当前系统平台上其它应用程序相似的外观。
二、使用wxWidgets
(一)wxWidgets框架
wxWidgets框架的设计思想是用户程序员利用wxWidgets工具箱中提供的类拼装自己需要的应用程序,并组合事件处理形成完整的应用程序。每一个wxWidgets程序都需要定义一个wxApp类的子类,需要创建并且只能创建一个这个类的实例,这个实例控制着整个程序的执行。wxWidgets应用程序中不会出现main(),而由宏IMP LEMENT_APP(wxApp)代替。用户程序员可以利用界面构造库中提供的类进行编程,但用户至少要先建立一个wxWidgets类库中直接由操作系统的窗口管理器管理的窗口类。这些窗口类是应用程序的最上层窗口,这个窗口可以使用wxFrame、wxDialog直接创建,也可以从它派生自己的Frame、Dialog,在这些类上建立wxPanel等实例,最后再实例化wxControl,并为各种控件添加相应的事件表和事件处理函数。
(二)事件处理机制
所有的GUI程序都是事件驱动的,应用程序一直停留在一个循环中,等待着来自用户或者其他什么地方的事件,一旦收到某种事件,应用程序就扔给处理这个事件的函数。wxWidgets能处理的事件类型有键盘事件和鼠标事件等,它们都是wxEvent的子类。在wxWidgets中,事件处理没是通过事件映射表将控件接收的事件与事件处理函数联系起来。
BEGIN_EVEN_TABLE(TextFrame,wxFrame)
//此处添加事件映射
EVT_BUTTON(ID_CLICK,TextFrame::OnClick)
END_EVENT_TABLE()
上述宏将TextFrame类中id为ID_CLICK的按钮按下的事件映射到该类的OnClick函数处理,OnClick函数具有这样的形式:
void OnClick(wxCommandEvent& event)
在类TextFrame的定义中还要插入一个宏DECLARE_EVENT_TABLE(),这个宏能够为事件映射表生成所需的数据成员和函数声明。
三、wxWidgets模块化开发
(一)wxWidgets自定义控件的开发
编写wxWidgets的一个自定义的控件需要下面的步骤:
1.编写类声明,通常情况下这个类是继承自wxControl的,这个类也可以继承自其它控件类,如wxButton。
2.如果已有的事件类不能满足需要,可以为控件增加新的事件类。对于按钮被按下的事件,使用已有的EVT_COMMAND就可以了。并且如果你增加了新的事件类,应增加相应的事件映射宏。新增事件类型,需要在头文件添加:
DECLARE_EVENT_TYPE(wxEVT_MY_EVENT,id)
声明新的事件类型;在实现文件添加:
DEFINE_EVENT_TYPE(wxEVT_MY_EVENT)
(二)利用wxWidgets进行模块化开发
从用户需求和系统要实现的任务功能出发,把大型的软件划分为相对较小的模块。为了减少模块与模块之间的关联性,模块之间的逻辑结构相对独立。以笔者的linux平台为例,简单介绍模块化开发的过程。
1.设计自定义控件模块的功能,模块的输入输出、对外接口、事件处理等。
2.编译控件。这一个步骤可以编写makefile进行自动编译,也可以直接使用g++命令进行编译。编译生成的目标文件后缀名一般为o。
3.在所需要使用的平台上测试这个控件,测试事件处理、输入输出数据和对外接口。
四、总结
作为一个功能强大的跨平台的并支持多种语言的类库,wxWidgets既可以开发GUI应用程序,也有许多非GUI的功能来开发应用程序。在越来越追求软件复用的现代软件开发方法中,软件的模块化、组件化越来越重要,设计良好的wxWidgets模块可以实现软件复用。
参考文献:
[1]Julian Smart,Kevin Hock,Stefan Csomor.Cross-Platform GUI Programming with wxWidgets.
[2]熊凯、高茂庭、于仁师,C++语言开发跨平台程序的研究与实现[J].电脑知识与技术,2006(2):127-130.
[3]朱丙立、熊江,跨平台框架程序wxWidgets的应用[J].电脑知识与技术,2006(5):132-133.