I would like Scintilla to ignore certain key combinations like, Ctrl+Enter or Ctrl+D, and to notify the parent window when they are entered. I read through the documentation and could not figure out how to do this. Is this possible?
views:
108answers:
2Is it possible to tell Scintilla to ignore certain keystrokes and pass them to the parent window?
Well, if all else fails you could subclass the Scintilla control's window procedure. It would be fairly straightforward to intercept the WM_KEYDOWN and WM_KEYUP messages, filter them, and then pass them either to the main Scintilla window proc or to your parent window.
There are two options, really. Hooking into WM_KEYDOWN
, as suggested, is one. The other is to use an accelerator table (see http://msdn.microsoft.com/en-us/library/ms645526(VS.85).aspx) to translate the keypresses into higher-level command IDs and process the command IDs in your WM_COMMAND
handler.
Using the accelerator table is undoubtedly the "right" way, but WM_KEYDOWN
seems to work just as well, and doesn't require changing the message loop code/tracking down the magic framework function that needs to be overridden/etc.
(If using MFC, the magic framework function for window-specific accelerator tables is CWnd::PreTranslateMessage
. Override it, call TranslateAccelerator
in there (passing in the accelerator table that is loaded in the constructor/OnCreate
/etc.) and return FALSE
-- if TranslateAccelerator
returned 0 -- or TRUE
-- if it returned something else. This allows the use of keyboard shortcuts that are specific to Scintilla windows.)
By the way, both these methods coexist quite happily, so some keypresses can be handled with accelerators and some with WM_KEYDOWN
. My last Scintilla program did this; I totally can't remember why, I'm afraid, but it certainly worked fine.