是否可以告诉 Scintilla 忽略某些击键并将它们传递给父窗口?
Posted
技术标签:
【中文标题】是否可以告诉 Scintilla 忽略某些击键并将它们传递给父窗口?【英文标题】:Is it possible to tell Scintilla to ignore certain keystrokes and pass them to the parent window? 【发布时间】:2009-12-30 20:57:40 【问题描述】:我希望 Scintilla 忽略某些组合键,例如 Ctrl+Enter 或 Ctrl+D,并在输入它们时通知父窗口。我通读了文档,但无法弄清楚如何做到这一点。这可能吗?
【问题讨论】:
在 LIVEditor 中,我在按键事件到达编辑器之前拦截它们。 【参考方案1】:好吧,如果一切都失败了,你可以继承 Scintilla 控件的窗口过程。拦截 WM_KEYDOWN 和 WM_KEYUP 消息,过滤它们,然后将它们传递给主 Scintilla 窗口 proc 或您的父窗口是相当简单的。
【讨论】:
我使用我在以下文章中找到的信息快速测试了这种方法:aaronballman.com/programming/REALbasic/…。它似乎工作正常。我投票给你,如果几天后没有得到更以 Scintilla 为中心的答案,我会接受这个。谢谢。 是的,我在文档中也找不到任何好的东西。祝你好运。【参考方案2】:真的有两种选择。正如建议的那样,连接到WM_KEYDOWN
就是其中之一。另一种是使用快捷键表(参见http://msdn.microsoft.com/en-us/library/ms645526(VS.85).aspx)将按键转换为更高级别的命令ID,并在WM_COMMAND
处理程序中处理命令ID。
使用加速器表无疑是“正确”的方式,但WM_KEYDOWN
似乎也能正常工作,并且不需要更改消息循环代码/跟踪需要覆盖的魔术框架函数/等等.
(如果使用MFC,窗口特定加速器表的魔术框架函数是CWnd::PreTranslateMessage
。覆盖它,在那里调用TranslateAccelerator
(传入构造函数中加载的加速器表/OnCreate
/etc .) 并返回 FALSE
-- 如果 TranslateAccelerator
返回 0 -- 或 TRUE
-- 如果它返回其他值。这允许使用特定于 Scintilla 窗口的键盘快捷键。)
顺便说一句,这两种方法共存得非常愉快,所以有些按键可以用加速键处理,有些可以用WM_KEYDOWN
处理。我上一个 Scintilla 程序就是这样做的;恐怕我完全不记得为什么了,但它确实工作得很好。
【讨论】:
如果您使用对话框(即使用 DialogBoxParam),我强烈建议使用挂钩方法而不是加速器,因为将加速器注入消息泵比挂钩窗口更复杂。以上是关于是否可以告诉 Scintilla 忽略某些击键并将它们传递给父窗口?的主要内容,如果未能解决你的问题,请参考以下文章