wxWidgets自定义消息及处理

自定义消息

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

/// UserEvent.h

class 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.h

class 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(& evt);
    ……
}

动态处理示例。

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

/// MainFrame.cpp

#include "MainFrame.h"
#include "UserEvent.h"


void MainFrame::MainFrame(…)
{
    ……
    Bind(PROJECT_EVENT, &MainFrame::OnProject, this, wxID_ANY);
    ……
}

自定义消息的发送

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

/// MainFrame.cpp


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

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

你可能感兴趣的:(wxWidgets自定义消息及处理)