【问题标题】:wxWidgets pprogrammaticaly move to next input controlwxWidgets pprogrammaticaly 移动到下一个输入控件
【发布时间】:2021-01-13 13:42:38
【问题描述】:

我最初有代码在 onInit 方法中将焦点设置到对话框中的第一个小部件。但它有问题:如果我按下 TAB,确实焦点移动到下一个控件 (wxTextCtrl),它得到蓝色的“焦点”颜色,但 “焦点”颜色/突出显示没有从上一个焦点小部件中删除。所以现在看起来第一个和第二个控件同时具有焦点......

当手动(通过按 TAB)循环一圈(直到最后一个控制然后绕到第一个)时,突然一切正常。也就是说,当将焦点从第一个控件移动到下一个控件时,第一个视觉上失去焦点(蓝色被移除),因为它应该。从现在开始,只有一项具有焦点颜色/高光。

因此,我没有将焦点设置在第一个控件上,而是尝试了一种不同的方法:我将焦点设置到对话框中的最后一个控件,它始终是 OK 按钮。接下来,我想以编程方式模拟对话框按下并接收 TAB。所以我写了这个(在 Dialog::onInit 里面):

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

现在焦点确实从 OK 按钮上移开了,但它并没有环绕到第一个控件。 只有当我在对话框打开后手动按 TAB 时,第一项才会获得焦点。

问题:为什么将焦点设置在第一个小部件上的这种环绕方式不适用于上面显示的代码?

【问题讨论】:

  • 您是否将 wxPanel 作为所有控件的父级或自己处理 TABbing?

标签: c++11 wxwidgets keyevent programmatically


【解决方案1】:

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

其次,您不能将 wx 事件发送到本机窗口,它们对此一无所知。在这种特殊情况下,您可以使用 wxWindow::Navigate() 来做您想做的事,但一般来说,您所做的简单操作不能也不会可靠地工作。

【讨论】:

  • 我只有三个按钮的事件处理程序:取消、确定和恢复。所以我不认为忘记 event.Skip() 是这里的问题,感谢 wxWindow::Navigate() 的提示,我会查找文档并尝试一下。
  • 我只能说,获得多个控件的唯一方法看起来好像它有焦点是通过处理,而不是跳过,wxFocusEvent。如果您找到了不同的方法,请尝试用最少的代码重现它并为它打开一个错误,因为这将是一个错误。
  • 嗨,我没有处理 wxFocusEvent。在可预见的未来,我没有时间做这样的例子……我需要专注于手头的工作。也许以后。不过虽然我很喜欢wxWidgets和Qt,但大概以后会用Uno吧。 platform.uno
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2013-07-25
相关资源
最近更新 更多