Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在wxWidgets中快速设置事件转发的方法?_C++_Wxwidgets - Fatal编程技术网

C++ 在wxWidgets中快速设置事件转发的方法?

C++ 在wxWidgets中快速设置事件转发的方法?,c++,wxwidgets,C++,Wxwidgets,我正在开发一个GUI,它有一个画布,周围有一堆控件和垃圾。我想让画布的事件处理程序有机会在没有焦点时处理按键之类的事件。我希望其他人继续正常工作 基本上,我想要设置的是告诉框架,“任何你得到的你自己没有处理的事件,将其转发到当前活动的画布上。”我想要最快速、最无痛的方法来完成这一操作…最好只是几行代码 问题出现在处理按键以改变其状态的过程中。例如,如果按住ctrl键,我们将停止捕捉栅格坐标,但在某些情况下,我们不会收到按下按钮的通知,因此无法更新光标,直到用户移动鼠标(此时我们在事件中检查键)。

我正在开发一个GUI,它有一个画布,周围有一堆控件和垃圾。我想让画布的事件处理程序有机会在没有焦点时处理按键之类的事件。我希望其他人继续正常工作

基本上,我想要设置的是告诉框架,“任何你得到的你自己没有处理的事件,将其转发到当前活动的画布上。”我想要最快速、最无痛的方法来完成这一操作…最好只是几行代码

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

谢谢

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

答案是,要做到这一点真的没有简单的方法。您不能简单地将未处理的任何内容发送到子小部件,因为如果它不处理它,您将再次获取它…然后再次发送它…等等…堆栈溢出。我真的很兴奋,当我终于设法引起这个

您也不能仅在应用程序框架内重写ProcessEvent。您必须在封装程序的应用程序派生对象中重写它。这样做的原因是,您将花费大量额外的时间尝试捕获从未达到这一点的事件…例如“向下键”(我此时特别想要的一个)。但是,wxApp::ProcessEvent函数似乎总是在未处理事件时被调用

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

然而,再一次,你甚至不能这样做,因为你会收到任何没有直接处理过的东西,然后把它寄回去…把它拿回来…把它寄回去

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


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

您可以使用ProcessEvent方法

在要转发的事件处理程序上,添加

/* Let the canvas process this event too */ 
canvas->ProcessEvent(aEvent);
其中“canvas”是指向画布的静态全局指针,“aEvent”是处理程序接收的事件对象


这样你甚至可以模拟事件!这就是我在GUI回归测试系统中使用的…

是的,我正在尝试这一点,看看它是否有效,除非我检查我的父母是否首先处理了它:如果(!wxAuiParentFrame::ProcessEvent(…)…)。。。。不幸的是,VS2010完全疯了,所以我不得不刮掉所有东西,重新检查并重新开始……到目前为止,这是一个伟大的一天:这对我来说不起作用,而且它真的应该起作用。我正在子类化WXScrolledwindowo来完成我的工作,当通过正常通道时,一切都正常工作,但是当我从框架调用ProcessEvent时,它只会查看WXScrolledwindowo的处理程序……它只是跳过我推到处理程序堆栈上的所有处理程序!我认为这可能是wx的convaluded类型系统,但我在调用ProcessEvent的派生类中创建了自己的“process_event”函数,从而超越了它。这真的开始让我生气了:佩文·陌生人……看来这并不像文件所记载的那样有效。ProcessEvent在我的帧上被调用,而没有首先到达我的窗口。然后,当焦点在窗口中时,我尝试将事件作为正确的处理目标,当焦点不在该窗口中时,它将被发送到基类,并且不会命中我的处理程序。接受这一点作为答案的开始。完整的细节将在问题编辑。