说明:
本文是作者的一点总结,对所学的回顾与记录,如有不妥之处,欢迎大家指正,并且讨论交流。
本文着重介绍如何自定义自己的事件类。
1、GUI程序是事件驱动的,一个wxGUI程序的执行过程:主函数在wxApp的OnInit()实现,OnInit()中创建一个frame或者dialog的实例,开始循环,等待事件发生并交给相应的事件处理函数处理。
2、事件分为两类:wxWidgets支持的控件事件以及自定义事件。wxWidgets控件事件有两种处理方法,静态时间表,动态事件连接;自定义事件一般继承自wxEvent或者其子类wxCommandEvent等其他事件。
3、一个事件一般包含标识符,事件类型,事件处理函数。
静态时间表头文件类中声明DECLARE_EVENT_TABLE();实现文件cpp
BEGIN_EVENT_TABLE(子类,父类)
EVT_PAINT(子类::处理函数)
END_EVENT_TABLE()
动态事件则用Connect()函数。
4、自定义事件代码如下:
class wxLihuanEvent : public wxEvent
{
private:
wxString m_string;
public:
wxLihuanEvent(wxEventType commandType = wxEVT_NULL,int id = 0);
virtual wxEvent ∗Clone() const;
wxString getString();
};
typedef void (wxEvtHandler::∗wxLihuanEventFunction)(wxLihuanEvent&);
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EVENT_TYPE(wxEVT_Lihuan, 801)
END_DECLARE_EVENT_TYPES()
#define EVT_LIHUAN(id, fn) \
DECLARE_EVENT_TABLE_ENTRY(wxEVT_Lihuan, id,−1,(wxObjectEventFunction) (wxEventFunction)(wxLihuanEventFunction) &fn,(wxObject ∗)NULL)
实现文件为:
#include "wxLihuanEvent.h"
DEFINE_EVENT_TYPE(wxEVT_Lihuan)
wxLihuanEvent::wxLihuanEvent(wxEventType commandType/*=wxEVT_NULL*/,int id /*= 0*/)
:wxEvent(commandType,id)
{
m_string="lihuan";
}
wxEvent* wxLihuanEvent::Clone()
{
return new wxLihuanEvent(*this);
}
wxString wxLihuanEvent::getString()
{
return m_string;
}
发送一个自定义事件
wxLihuanEvent event(wxEVT_Lihuan, GetId());
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
wxWidgets中的宏很多,自定义事件也可用,不过最终还是如此,要灵活,条条大路通罗马不是。