最近正在研究wxWidgets GUI开发框架,这里演示一个在Windows平台下的自定义消息的示例。自定义一个事件,希望在线程计算完π值之后发送自定义事件通知主窗口任务完毕!
那么,如何自定义事件呢,分类为以下几步:
1、从wxCommandEvent类派生出自己的自定义事件类,如果希望能够否决这个事件,那么可以从wxNotifyEvent类继承。这里要注意,派生类要实现拷贝构造函数和一个完整的Clone方法。代码如下:
(头文件尾wxThreadFinishedEvent.h,实现文件为wxThreadFinishedEvent.cpp)
class wxThreadFinishedEvent : public wxNotifyEvent
{
public:
// 需要实现一个完整的Clone方法
virtual wxEvent* Clone() const {
return new wxThreadFinishedEvent(*this);
}
// 构造函数
// eventType:自定义事件的类型
// id:事件id,就是事件映射宏中的事件id
wxThreadFinishedEvent(wxEventType eventType = wxEVT_NULL, int id = 0) :
wxNotifyEvent(eventType, id) {
}
// 拷贝构造函数
wxThreadFinishedEvent(const wxThreadFinishedEvent& event) :
wxNotifyEvent(event) {
}
// 析构函数
virtual ~wxThreadFinishedEvent() {
}
DECLARE_DYNAMIC_CLASS(wxThreadFinishedEvent);
};
2、声明自定义事件类型为wxEVT_THREAD_FINISHED,代码如下:
#define ID_THREAD_FINISHED_EVENT_TYPE (wxID_HIGHEST+100) // 事件类型id
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EVENT_TYPE(wxEVT_THREAD_FINISHED, ID_THREAD_FINISHED_EVENT_TYPE)
END_DECLARE_EVENT_TYPES()
注意:wxWidgets框架预定义了许多形如wxID_xxx的ID,如果我们希望使用自定义ID,那么可以使用大于wxID_HIGHEST或者小于wxID_LOWEST的值。
3、定义事件处理函数的原型
typedef void (wxEvtHandler::*wxThreadFinishedEventFunction)(wxThreadFinishedEvent&);
注意:如果没有wxEvtHandler::*的话,编译器会报错,类型转换失败。
4、定义加入到事件表中的事件映射宏,类似于EVT_MENU、EVT_BUTTON等宏。
#define EVT_THREAD_FINISHED(id, fn) DECLARE_EVENT_TABLE_ENTRY( \
wxEVT_THREAD_FINISHED, id, -1, \
(wxObjectEventFunction)(wxEventFunction)(wxThreadFinishedEventFunction)&fn, \
(wxObject*)NULL),
注意这个类型转换(wxObjectEventFunction)(wxEventFunction)(wxThreadFinishedEventFunction)&fn,否则编译器会报错,类型转换失败。
这里可以为我们的自定义事件定义一个ID.
#define ID_THREAD_FINISHED (wxID_HIGHEST+12)
再看看.cpp文件,该文件很简单,主要完成DECLARE_DYNAMIC_CLASS和DECLARE_EVENT_TYPE这两个宏的定义工作:
#include "wx/wx.h"
#include "wxThreadFinishedEvent.h"
DEFINE_EVENT_TYPE(wxEVT_THREAD_FINISHED)
IMPLEMENT_DYNAMIC_CLASS(wxThreadFinishedEvent, wxNotifyEvent)
这样,这个自定义事件就算完成了。那么如何使用呢,就像使用内建的EVT_MENU宏一样,在BEGIN_EVENT_TABLE()和END_EVENT_TABLE()之间加上EVT_THREAD_FINISHED();然后再发送事件:
wxThreadFinishedEvent event(wxEVT_THREAD_FINISHED, ID_THREAD_FINISHED);
event.SetEventObject(窗口指针);
frame->ProcessEvent(event);
具体的示例代码我已附上。
 |
文件: |
CustomEvt.rar |
大小: |
17KB |
下载: |
下载 | |
阅读(1192) | 评论(0) | 转发(0) |