天天看点

wxWidgets学习笔记(三):事件

说明:

本文是作者的一点总结,对所学的回顾与记录,如有不妥之处,欢迎大家指正,并且讨论交流。

本文着重介绍如何自定义自己的事件类。

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中的宏很多,自定义事件也可用,不过最终还是如此,要灵活,条条大路通罗马不是。

继续阅读