我尝试实现自己的自定义事件。如果我从连接它的类(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,但它对我没有帮助。
答案 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);