拦截 wxTextCtrl 中的加速键
Intercepting accelerator keys inside wxTextCtrl
我有一个包含多个项目的菜单,所有项目都具有使用制表符便捷方法定义的加速器快捷方式。像这样:
Increase volume\tCtrl+Up
到目前为止一切顺利。但是,我的两个加速器分别使用快捷键 Ctrl+Left 和 Ctrl+Right。我的问题是,虽然专注于 TextCtrl,但这些快捷方式已经具有预期的功能 - 在文本字段中,Ctrl+Left 和 Ctrl+Right 应该按单词导航。我的大多数用户会非常频繁地使用键盘,因此这些功能按预期工作是关键。
到目前为止,我已经知道我可以通过绑定 wxEVT_CHAR_HOOK 的处理程序来拦截所有键,然后再将它们处理为加速器使用。但我不太确定如何从这一点开始。我想定义一组应该传递给 TextCtrl 的快捷方式,但如果其他加速器没有特定于 TextCtrl 的功能,则允许它们正常处理。例如,Ctrl+Left 和 Ctrl+Right 应由 TextCtrl 处理,因为它们按单词导航,但 Ctrl+O 应触发其关联的菜单命令,因为 TextCtrl 对该特定快捷方式没有用处。
这里不能更改快捷方式(例如,更改为 Alt+Left 而不是 Ctrl+Left),因为应用程序允许用户以交互方式更改加速器。当 TextCtrl 具有焦点时禁用有问题的菜单项也不会起作用,因为关联的加速器快捷方式仍然不会在 TextCtrl 中执行它们的预期功能(即使用加速器 Ctrl+Left 禁用菜单项不会神奇地使TextCtrl 正确处理该组合键)。后一点貌似是wx的bug,但事实就是如此
如果您在 Windows 下遇到此问题,覆盖 wxWindow::MSWShouldPreProcessMessage()
并为有问题的组合键返回 false 应该可以解决它。然而,这是一个仅限 C++ 的解决方案,我不知道 wxPhoenix 是否提供了一种从 Python 覆盖虚拟方法的方法(而且几乎可以肯定经典 wxPython 没有)。
可以说,wxTextCtrl::MSWShouldPreProcessMessage()
中的库版本应该已经这样做了,所以也许你可以修改 wxWidgets 本身(并提交一个包含你的更改的补丁,这样就不必自己维护它们了)。
我有一个包含多个项目的菜单,所有项目都具有使用制表符便捷方法定义的加速器快捷方式。像这样:
Increase volume\tCtrl+Up
到目前为止一切顺利。但是,我的两个加速器分别使用快捷键 Ctrl+Left 和 Ctrl+Right。我的问题是,虽然专注于 TextCtrl,但这些快捷方式已经具有预期的功能 - 在文本字段中,Ctrl+Left 和 Ctrl+Right 应该按单词导航。我的大多数用户会非常频繁地使用键盘,因此这些功能按预期工作是关键。
到目前为止,我已经知道我可以通过绑定 wxEVT_CHAR_HOOK 的处理程序来拦截所有键,然后再将它们处理为加速器使用。但我不太确定如何从这一点开始。我想定义一组应该传递给 TextCtrl 的快捷方式,但如果其他加速器没有特定于 TextCtrl 的功能,则允许它们正常处理。例如,Ctrl+Left 和 Ctrl+Right 应由 TextCtrl 处理,因为它们按单词导航,但 Ctrl+O 应触发其关联的菜单命令,因为 TextCtrl 对该特定快捷方式没有用处。
这里不能更改快捷方式(例如,更改为 Alt+Left 而不是 Ctrl+Left),因为应用程序允许用户以交互方式更改加速器。当 TextCtrl 具有焦点时禁用有问题的菜单项也不会起作用,因为关联的加速器快捷方式仍然不会在 TextCtrl 中执行它们的预期功能(即使用加速器 Ctrl+Left 禁用菜单项不会神奇地使TextCtrl 正确处理该组合键)。后一点貌似是wx的bug,但事实就是如此
如果您在 Windows 下遇到此问题,覆盖 wxWindow::MSWShouldPreProcessMessage()
并为有问题的组合键返回 false 应该可以解决它。然而,这是一个仅限 C++ 的解决方案,我不知道 wxPhoenix 是否提供了一种从 Python 覆盖虚拟方法的方法(而且几乎可以肯定经典 wxPython 没有)。
可以说,wxTextCtrl::MSWShouldPreProcessMessage()
中的库版本应该已经这样做了,所以也许你可以修改 wxWidgets 本身(并提交一个包含你的更改的补丁,这样就不必自己维护它们了)。