{ ID_TEXTCTRL, ID_BUTTON };
采用 Sizer 机制进行界面布局有相当大的优势。要想设计好自己的程序界面,必须对 Sizer 有比较深入的了解。
参考文档:http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html(Sizer一览)
采用XML格式文件(XRC文件)定义程序界面也是不错的方式,详见:http://www.wxwidgets.org/manuals/2.6.3/wx_xrcoverview.html(基于XML的资源系统一览)。
无论如何,手工进行界面布局总是很繁杂,我们需要(可视化)工具的帮助:http://www.wxwidgets.org/apps2.htm
处理事件
在wxWidgets中处理事件,主要有两个步骤:编写“事件处理函数(方法)”,填写“事件表(EVENT_TABLE)”。
事件处理函数(方法)视事件的不同而有所不同,但也有规律:没有返回值,只有一个引用型参数(且一定是wxEvent的子类),不是虚方法(virtual method)。事件处理函数(方法)的名称没有特殊规定,可以自行命名。
作为示例,我们来处理上图中“测试按钮”被按下的事件。
根据wxWidgets文档,要处理按钮事件,需在自己的类中添加如下事件处理函数(方法):void MainFrame::OnButtonClick(wxCommandEvent &event)
具体说来就是,在 mainframe.h 文件中的 MainFrame 类中增加新的 OnButtonClick() 方法声明: private: void OnButtonClick(wxCommandEvent& event);
并在 mainframe.cpp 文件中增加 OnButtonClick() 方法的定义: void MainFrame::OnButtonClick(wxCommandEvent &event) { //取编辑框中的文本并用信息框显示出来 wxString text = ((wxTextCtrl*)this->FindWindow(ID_TEXTCTRL))->GetValue(); wxMessageBox(text); }
下面需要在 mainframe.cpp 中填写“事件表(EVENT_TABLE)”,以便我们的“事件处理函数(方法)”能在适当的时机(即事件触发时)被调用: BEGIN_EVENT_TABLE(MainFrame, wxFrame) EVT_BUTTON(ID_BUTTON, MainFrame::OnButtonClick) END_EVENT_TABLE()
在这个事件表中,我们使用宏 EVT_BUTTON 指定了按钮的ID,以及“事件处理函数(方法)”。
注:上面一直讲“事件处理函数(方法)”,其实是“方法(method)”不是“函数(function)”,只是“方法”这个词在编程领域和在日常生活中可以有不同的理解(“方法”也可以理解为“方式”),我如果说成“事件处理方法”,难免会产生歧义。当然,“事件处理函数(方法)”似乎也并不十分合适,应称为“事件处理‘方法’”或“事件处理方法(method)”?再深究下去就有咬文嚼字的嫌疑了,聪明的读者早已明白我的意思了吧?
现在“测试按钮”已经可以响应鼠标单击事件了。下面两图分别是我们的程序在Windows和红旗Linux(4)下的运行结果:
](/uploadImages/2007-5-2/20075222264189244.gif)
](/uploadImages/2007-5-2/20075222264222325.gif)
如何处理其它事件?
说白了,关键要知道两点:事件处理函数(方法)的参数是什么类型,填写参数表时用哪一个宏(EVT_*)。
再补充一点:要知道“什么控件”在“什么时机”会触发“什么事件”。
要知道这些,就需要对wxWidgets的事件处理有一个比较全面的了解。
建议看一下wxWidgets官方文档中的这篇文章:http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html(事件处理一览)
尤其是其中的 Event macros summary(事件宏概要)一段。
电子书《Cross-Platform GUI Programming with wxWidgets》附录9(Appendix I, 617页)中对事件处理时所涉及的事件类型(wxXXXEvent)和事件宏(EVT_*)有比较好的总结,建议看一下,最好打印出来放在手边,以便随时参考。
本文所涉及的完整源代码可在此下载:http://liigo.diy.myrice.com/article/wxProject/wxProject.zip
更进一步
了解 Sizer,熟悉界面设计:http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html
了解 事件处理:http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html
了解 wxWidgets 提供了哪些控件,它们各自的属性、方法、事件,以及它们的用法。
去 wxWidgets.org 上找第三方的控件/库:http://www.wxwidgets.org/contrib2.htm#classes
去 wxWiki 上找第三方的控件/库:http://www.wxwidgets.org/wiki/index.PHP/Table_Of_Contents#Pages_about_classes.2C_functions_or_macros
上一篇:A Summary of Principles for User-Interface Design.
下一篇:给年轻工程师的十大忠告
|