views:

108

answers:

2

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?

+1  A: 

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.

ChrisV
I quickly tested this approach using the information I found in the following article: http://www.aaronballman.com/programming/REALbasic/WindowSubclassingArticle.php. It seems to work fine. I voted you up and if don't get a more Scintilla centric answer in a couple days I'll accept this one. Thanks.
Lawrence Barsanti
Yeah, I couldn't find anything good in the documentation either. Best of luck.
ChrisV
A: 

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.

brone