wxwidgets自定义事件不会传播到父窗口

时间:2014-01-22 12:46:44

标签: c++ visual-c++ wxwidgets

我尝试实现自己的自定义事件。如果我从连接它的类(wxFrame)发布它,它确实有效,但是如果它从子wxFrame发布它就不会被捕获。

自定义事件:

**cFrameFocus.h**
#pragma once
#include <wx\event.h>
class cFrameFocusEvent;
const wxEventTypeTag<cFrameFocusEvent> evtFRAME_FOCUS( wxNewEventType() );
//eventhandler macro
#if _MSC_VER <= 1600
typedef void (wxEvtHandler::*MyFrameFocusEventFunction)(cFrameFocusEvent&);
#define FrameFocusEventHandler(func) wxEVENT_HANDLER_CAST(MyFrameFocusEventFunction,func)
#else
#define FrameFocusEventHandler(func) (&func)
#endif
class cFrameFocusEvent :
    public wxEvent
{
    wxWindow* m_frame;
public:
    cFrameFocusEvent(wxEventType pEventType,int pWinId = wxID_ANY,const wxWindow* pWin = 0);
    ~cFrameFocusEvent(void);
    //impement base class pure virtual
    virtual wxEvent* Clone(void)const;
    //accessor
    wxWindow* GetWindow(void)const;
};

**cFrameFocus.cpp**
#include "cFrameFocus.h"
cFrameFocusEvent::cFrameFocusEvent(wxEventType pEventType,int pWinId,const wxWindow* pWin):
wxEvent(pWinId,pEventType)
{
    m_frame = const_cast<wxWindow*>(pWin);
}
cFrameFocusEvent::~cFrameFocusEvent(void)
{
}
wxEvent* cFrameFocusEvent::Clone(void)const{
    return new cFrameFocusEvent(*this);
}
wxWindow* cFrameFocusEvent::GetWindow(void)const{
    return m_frame;
}

子框架尝试发送偶数:

cFrameFocusEvent* pevent = new cFrameFocusEvent(evtFRAME_FOCUS,GetId(),this);
wxQueueEvent(GetParent(),pevent);

注意:我已经偶然发现了这个问题wxWidgets 2.9 custom events,但它对我没有帮助。

2 个答案:

答案 0 :(得分:3)

您需要阅读event propagation overview以了解事件在wxWidgets中的工作方式。特别是,它会告诉您,默认情况下,只有wxCommandEvent派生的事件会向上传播,而其他事件需要调用ResumePropagation(N)以使它们传播N级别(和当然可以INT_MAX使它们无限制地传播。

答案 1 :(得分:1)

经过一些密集的调试和研究wxWidgets代码后,我发现了它。 问题是,对于文件“cFrameFocus.h”的每个包含,wxEventTypeTag都改变了(它的id),这意味着当它被包含在文件中以连接到这个事件时,类型id的id为“x”并且在发布此事件的另一个文件,事件类型的ID为“y”。 对此的解决方案不是传播的问题(因为它无论如何都被发送到0级,它应该被处理),而不是“编程错误”。

**cFrameFocus.h**
extern const wxEventTypeTag<cFrameFocusEvent> evtFRAME_FOCUS;

**cFrameFocus.cpp**
const wxEventTypeTag<cFrameFocusEvent> evtFRAME_FOCUS(wxNewEventType());

此代码更改修复了错误

修改

正如VZ在评论中提到的那样,使用宏更合适,而不是直接访问函数。

正确的解决方案:

***cFrameFocus.h***

wxDECLARE_EVENT(evtFRAME_FOCUS,cFrameFocusEvent);

***cFrameFocus.cpp***
 wxDEFINE_EVENT(evtFRAME_FOCUS,cFrameFocusEvent);