0

我希望 Scintilla 忽略某些组合键,例如 Ctrl+Enter 或 Ctrl+D,并在输入它们时通知父窗口。我通读了文档,无法弄清楚如何做到这一点。这可能吗?

4

2 回答 2

2

好吧,如果一切都失败了,你可以继承 Scintilla 控件的窗口过程。拦截 WM_KEYDOWN 和 WM_KEYUP 消息,过滤它们,然后将它们传递给主 Scintilla 窗口过程或您的父窗口是相当简单的。

于 2009-12-30T21:27:46.673 回答
1

有两种选择,真的。如建议的那样,挂钩WM_KEYDOWN是其中之一。另一种是使用加速器表(参见http://msdn.microsoft.com/en-us/library/ms645526(VS.85).aspx)将按键转换为更高级别的命令 ID 并处理命令 ID在你的WM_COMMAND处理程序中。

使用加速器表无疑是“正确”的方式,但WM_KEYDOWN似乎也可以正常工作,并且不需要更改消息循环代码/跟踪需要覆盖的魔术框架功能/等。

(如果使用 MFC,特定于窗口的快捷键表的魔术框架函数是CWnd::PreTranslateMessage. 覆盖它,TranslateAccelerator在那里调用(传入在构造函数//OnCreate等中加载的快捷键表)并返回FALSE-- 如果TranslateAccelerator返回 0 -- 或TRUE-- 如果它返回了其他东西。这允许使用特定于 Scintilla 窗口的键盘快捷键。)

顺便说一句,这两种方法共存得非常愉快,所以有些按键可以用加速器处理,有些用WM_KEYDOWN. 我上一个 Scintilla 程序就是这样做的;恐怕我完全不记得为什么了,但它确实工作得很好。

于 2010-01-02T23:48:49.730 回答