wxWidgets以编程方式移至下一个输入控件

问题描述

我最初使用onInit方法代码的焦点设置为对话框中的第一个小部件。但这有问题:如果我按下TAB键,焦点实际上移到了下一个控件(wxTextCtrl),该控件具有蓝色的“焦点”颜色,但是“焦点”颜色/突出显示并未从以前的焦点小部件中删除。所以现在看来​​,第一个和第二个控件同时处于焦点位置...

当手动循环(按TAB键)整圈(直到最后一个控件,然后环绕到第一个)时,突然所有效果很好。也就是说,当将焦点从第一个控件移到下一个控件时,第一个视觉上失去焦点的焦点(蓝色被删除)应有。从现在开始,只有一项具有焦点颜色/突出显示

因此,我没有将焦点设置在第一个控件上,而是尝试了另一种方法:将焦点设置到对话框中的最后一个控件上,该控件始终是“确定”按钮。接下来,我要以编程方式模拟对话框按下并接收TAB。所以我写了这个(在Dialog :: onInit内部):

    m_buttonOK->SetFocus();
    wxKeyEvent key;
    key.SetEventObject(this);
    key.SetEventType(wxEVT_CHAR);
    key.m_keyCode=WXK_TAB;
    ProcessWindowEvent(key);

现在焦点确实移开了“确定”按钮,但并没有绕到第一个控件。 只有在对话框打开后手动按TAB键时,第一项才能获得焦点。

问题:为什么要绕开以将焦点放在第一个小部件上与上面显示代码一起工作?

解决方法

首先,您的最初问题几乎可以肯定与未在您的事件处理程序之一中调用event.Skip()有关,请参阅wxFocusEvent documentation中的注释。

第二,您无法将wx事件发送到本机窗口,他们对此一无所知。在这种特殊情况下,您可以使用wxWindow::Navigate()来完成自己想要的事情,但总的来说,简单地做的事情不能也不会可靠地工作。