c++ - wxWidgets中快速设置事件转发的方法?

标签 c++ wxwidgets

我正在开发一个 GUI,它有一个 Canvas 和一堆控件以及围绕它的废话。我想让 Canvas 的事件处理程序有机会在没有焦点时处理按键等事件。我希望其他人继续正常工作。

基本上我想要设置的是告诉框架,“任何你没有自己处理的事件,将它转发到当前事件的 Canvas 上。”我想要最快、最轻松的方法...最好只是几行代码。

问题出在处理按键以改变其状态的事物上。例如,如果您按住 ctrl,我们将停止捕捉到网格坐标,但在某些情况下我们不会收到按下通知,因此在用户移动鼠标之前无法更新光标(此时我们检查事件为 key )。只有当焦点在控制之中时,我们才会得到媒体的关注。我们以前遇到过这个问题,只是解决了它,但现在有这些情况如果没有这种转发机制就无法解决。

谢谢。

============================================= ========

答案是确实没有简单的方法可以做到这一点。您不能简单地将任何未处理的内容发送给子小部件,因为如果它不处理它,那么您将再次获得它……然后再次发送……等等……堆栈溢出。当我终于成功地做到这一点时,我真的很兴奋……

您也不能只在应用程序框架内覆盖 ProcessEvent。您必须在封装程序的 App 派生对象中重写它。这样做的原因是您将花费大量额外时间来 try catch 从未达到这一点的事件......例如按键(我此时特别想要的那个)。 wxApp::ProcessEvent 函数似乎总是在未处理事件时被调用。

您不能简单地在您的目标上调用 ProcessEvent(甚至暂时忘记第一段),因为它不会调用您推送给它的处理程序。如果使用 PushEventHandler 将事件的处理器添加到目标,则不会通过 target->ProcessEvent(event) 访问它,而是需要使用 target-> 激活处理程序本身GetHandler()->ProcessEvent(event).

但是,同样,您甚至不能这样做,因为您会收到任何未直接处理的东西并将其发回...取回...发回...

答案是在目标的处理程序中编写 ProcessEvent 的拷贝,除了覆盖 wxApp::ProcessEvent 之外,它不使用 TryParent。我最终只保留了一个指向处理我想要转发的事件的处理程序的指针,然后最终(在一堆抽象之后)调用 this->GetEventHashTable().HandleEvent(event,this) 其中“this”是需要激活的处理程序。这是 wxEvtHandler::ProcessEvent 中的关键行,它实际上从你的表中获取函数并激活它;它跳过了验证器和其他一些废话,并且没有 TryParent。

这就是我打败 WX 并完成不可能的事情的方式。

最佳答案

您可以使用 ProcessEvent 方法。

在你要转发的事件处理器上,添加

/* Let the canvas process this event too */ 
canvas->ProcessEvent(aEvent);

其中“canvas”是指向 Canvas 的静态全局指针,“aEvent”是处理程序接收的事件对象。

这样您甚至可以模拟事件!这就是我用于我的 GUI 回归测试系统的...

关于c++ - wxWidgets中快速设置事件转发的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3365269/

相关文章:

c++ - 使用继承函数而不是基础函数(不是抽象的)

c++ - 如何使用wxwidgets下载二进制文件

c++ - 在 Windows 上的 C++ 中使用和创建 wxwidgets 中的线程

c++ - 将字符数组的一部分复制到 C++ 中的 wxString

c++ - 将单个事件连接到 wxWidgets 中的特定方法

c++ - 在堆栈上分配局部变量并使用指针算法

c++ - 在 C++ 代码中重新启动连接时出现“断管”错误

c++ - 创建类似目录树的 Windows 资源管理器

c++ - 雅可比迭代法。 (帮我输出)

c++ - SFINAE:static_assert 与 std::enable_if