我正在开发一个GUI,它有一个画布和一堆控件和垃圾。我想让canvas的事件处理程序有机会处理像按键这样的事件,当它没有焦点时。我希望其他人继续正常工作。
基本上我想要设置的是告诉框架,“你得到的任何你自己不会处理的事件,将它转发到当前活动的画布上。”我想要最快,最无痛的方法...最好只需几行代码。
问题在于处理按键以改变其状态的事情。例如,如果你按住ctrl我们停止捕捉到网格坐标,但是在某些条件下我们没有得到按下的通知,因此在用户移动鼠标之前无法更新光标(此时我们检查事件为了钥匙)。如果焦点在控制中,我们只会得到新闻。我们之前遇到过这个问题并且只是解决了这个问题,但是现在有这几个条件在没有这种转发机制的情况下无法解决。
感谢。
=============================================== ======
答案是,确实没有简单的方法可以做到这一点。你不能只是简单地将任何未经处理的东西发送到子窗口小部件,因为如果它不处理它,那么你将再次获得它......然后再将其发送给它......等等......堆栈溢出。当我终于设法引起这个时,我真的很兴奋......
您也不能只在应用程序框架中覆盖ProcessEvent。您必须在封装程序的App派生对象中覆盖它。这样做的原因是你会花费大量的额外时间来捕捉从未达到过这一点的事件......例如关键时刻(我此时特别想要的那个)。 wxApp :: ProcessEvent函数似乎总是在未处理事件时被调用。
你不能简单地在目标上调用ProcessEvent(甚至暂时忘记第一段),因为它不会调用你推送到它上面的处理程序。如果使用PushEventHandler将事件的处理器添加到目标,则无法通过target->ProcessEvent(event)
访问该目标,而是需要使用target->GetHandler()->ProcessEvent(event)
激活处理程序。
然而,再一次,你甚至不能这样做,因为你会收到任何没有直接处理过的东西并把它发回去......把它拿回来......把它寄回去......
答案是除了重写wxApp :: ProcessEvent之外,在目标的处理程序中写入一个不是TryParent的ProcessEvent副本。我最后只保留了一个指向处理程序的指针,该处理程序处理我想要转发的事件,然后最终(在一堆抽象之后),调用this->GetEventHashTable().HandleEvent(event,this)
,其中“this”是需要激活的处理程序。这是wxEvtHandler :: ProcessEvent中的关键线,它实际上从表中获取函数并激活它;它会跳过验证器,其他一些废话,而不是TryParent。
这就是我击败WX并完成不可能的事情。
答案 0 :(得分:0)
您可以使用ProcessEvent方法。
在您要转发的事件处理程序上,添加
/* Let the canvas process this event too */
canvas->ProcessEvent(aEvent);
其中“canvas”是指向画布的静态全局指针,“aEvent”是处理程序接收的事件对象。
这样你甚至可以模拟事件!这就是我用于GUI回归测试系统......