wxwidgets 自定义事件不会传播到父窗口
wxwidgets custom event won't propagate to the parent window
我试图实现自己的自定义事件。如果我从班级中发布它,它确实有效,我从(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);
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取 GLFW 窗口 ID?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 用于窗口的 HID 终端
- SFML 文本未绘制在窗口上
- 如何为窗口截屏
- wxwidgets 自定义事件不会传播到父窗口