在 wxFrame 或 wxDialog 中处理EVT_CHAR

Handle EVT_CHAR in wxFrame or wxDialog

本文关键字:EVT CHAR 处理 wxFrame wxDialog      更新时间:2023-10-16
众所周知

,EVT_CHAR是一个基本事件,不会传播到 wxTopLevelWindow(wxFrame 和 wxDialog)。

但是我有一个没有任何wxWidgets控件的wxDialog,需要处理用户键盘输入(处理EVT_CHAR事件)。

我看到了关于全局捕获关键事件的 wiki,但它不适用于EVT_CHAR事件EVT_CHAR因为需要翻译该事件以获取用户输入

我尝试让wxDialog隐藏的孩子wxWindow,它将EVT_CHAR转发到其父wxDialog。它适用于Windows平台,而不是我的目标平台OSX。

有没有办法实现它?

为什么需要处理对话框本身中的所有键盘输入?据我所知,有两种典型的情况:要么你想以相同的方式处理几个不同控件中的按键,要么你需要处理一些特定的按键(例如 WXK_F1 ) 在所有控件中。前者可以通过将同一事件处理程序绑定到多个控件来完成。后者 - 通过使用加速器表,其中包含要专门处理的键的条目。

最后,我根据这个实现了我想要的:http://trac.wxwidgets.org/ticket/15345

在wxWidgets 3.0中,wxNSView实现了NSTextInputClient协议,这使得每个widget都可以正确处理EVT_CHAR。

但是EVT_CHAR仍然不能由wxDialog或wxFrame处理,因为IsUserPanel()函数的某些调用。所以我评论了IsUserPanel的一些调用,使其为我工作。