wxWidgets自定义消息及处理

来源:互联网 发布:js删除cookie值的方法 编辑:程序博客网 时间:2024/06/01 07:31

自定义消息

用户自定义消息通常从wxEvent派生,下面,以一个用户自定义的ProjectEvent为例,说明自定义消息的步骤:
首先,在头文件中声明消息。

/// UserEvent.hclass ProjectEvent :wxEvent{public:    ProjectEvent(int itemId, int eventTag);public:    int  mItemId;    int  mEventTag;    ……}wxDECLARE_EVENT(PROJECT_EVENT, ProjectEvent);

其中,wxDECLARE_EVENT(PROJECT_EVENT, ProjectEvent)的含义是声明了一个新的消息类型PROJECT_EVENT,该消息类型对应的消息类是ProjectEvent。即,用户在消息循环中处理PROJECT_EVENT消息时,消息循环给用户消息处理函数提供的参数类别是ProjectEvent类。

然后,在源文件中定义消息。

/// UserEvent.cpp#include "UserEvent.h"wxDEFINE_EVENT(PROJECT_EVENT, ProjectEvent);ProjectEvent::ProjectEvent(int itemId, int eventTag): wxEvent(), mItemId(itemId), mEventTag(eventTag){}

注意,必须在源文件中声明wxDEFINE_EVENT(PROJECT_EVENT, ProjectEvent)。否则会在执行过程中出错。出错的主要原因似是有关消息代码的分配。

自定义消息的处理

自定义消息的处理与预定义消息的处理方式相同,主要包括两种处理方式:静态处理和动态处理。

静态处理示例。

在头文件中声明消息处理函数。

/// MainFrame.hclass MainFrame : public wxFrame{    ……public:    void OnProject(wxEvent & evt);     ……    DECLARE_EVENT_TABLE();}

在实现文件中定义消息处理函数。

/// MainFrame.cpp#include "MainFrame.h"#include "UserEvent.h"BEGIN_EVENT_TABLE(MainFrame, wxFrame)    ……    EVT_CUSTOM(PROJECT_EVENT, wxID_ANY, OnProject)    ……END_EVENT_TABLE()void MainFrame::OnProject(wxEvent & evt){    /// 作为参数的event类型,应可以转换为ProjectEvent类型.    ProjectEvent * projEvt = dynamic_cast<ProjectEvent *>(& evt);    ……}

动态处理示例。

头文件中声明与静态处理相同。
实现文件中,不用定义消息处理表,在初始化时动态绑定消息处理函数。代码如下:

/// MainFrame.cpp#include "MainFrame.h"#include "UserEvent.h"void MainFrame::MainFrame(…){    ……    Bind(PROJECT_EVENT, &MainFrame::OnProject, this, wxID_ANY);    ……}

自定义消息的发送

用户通过对指定窗口调用ProcessWindowEvent函数,参数为自定义的ProjectEvent消息类型,即刻向指定窗口发送ProjectEvent消息,并由该窗口的消息处理函数进行处理。
代码如下:

/// MainFrame.cppvoid MainFrame::SendEvent(…){    ……    ProjectEvent event(id, tag);    targetWnd->ProcessWindowEvent(event); /// targetWnd窗口处理消息    ……}

注意,该函数采用同步处理机制,类似MFC中的SendMessage,即消息处理完成后该函数才返回。与MFC类似,wxWidgets还有异步的消息发送机制,通过调用QueueEvent可以完成消息的异步消息发送,即发送完消息立刻返回,目标窗口将在后续的空闲消息循环中处理用户消息,类似MFC中的PostMessage

0 0
原创粉丝点击