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

wxwidgets custom event won't propagate to the parent window

本文关键字:窗口 传播 自定义 事件 wxwidgets      更新时间:2023-10-16

我试图实现自己的自定义事件。如果我从班级中发布它,它确实有效,我从(wxframe)连接了它,但是如果它从孩子wxframe张贴,它不会被捕获。

自定义事件:

**cFrameFocus.h**
#pragma once
#include <wxevent.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自定义事件,但对我没有帮助。

您需要阅读事件传播概述,以了解事件在WXWIDGETS中的工作方式。特别是,它会告诉您,默认情况下,只有从wxCommandEvent衍生的事件向上传播,对于其他情况,您需要调用ResumePropagation(N)才能使其传播N级别(并且可以是INT_MAX,并且可以使它们无限,当然可以使其传播)。

在对WXWIDGETS代码进行了深入的调试和研究之后,我弄清楚了。问题在于,在文件" cframefocus.h"的每个包含中发布此事件的其他文件该事件类型具有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);