Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49724
  • 博文数量: 9
  • 博客积分: 411
  • 博客等级: 一等列兵
  • 技术积分: 113
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-07 15:32
文章分类

全部博文(9)

文章存档

2010年(9)

我的朋友

分类: WINDOWS

2010-09-27 01:20:50

最近正在研究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
下载: 下载
阅读(3158) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

aceGavin2015-05-29 17:48:10

后面的例子程序下载不了啊