¿Es posible decirle a Scintilla que ignore ciertas teclas y las pase a la ventana principal?
-
22-09-2019 - |
Pregunta
Me gustaría que Scintilla ignore ciertas combinaciones de clave como, Ctrl+Enter o Ctrl+D, y notifique a la ventana principal cuando se ingresan. Leí la documentación y no pude descubrir cómo hacer esto. es posible?
Solución
Hay dos opciones, de verdad. Enganchando WM_KEYDOWN
, como se sugirió, es uno. El otro es usar una tabla de acelerador (ver http://msdn.microsoft.com/en-us/library/ms645526(vs.85).aspx) para traducir los KeyPresses en ID de comando de nivel superior y procesar las ID de comando en su WM_COMMAND
manipulador.
El uso de la tabla de acelerador es sin duda la forma "correcta", pero WM_KEYDOWN
parece funcionar igual de bien, y no requiere cambiar el código de bucle de mensaje/rastrear la función de marco mágico que debe ser anulado/etc.
(Si usa MFC, la función de marco mágico para las tablas de acelerador específicas de la ventana es CWnd::PreTranslateMessage
. Anularlo, llamar TranslateAccelerator
allí (pasando en la tabla del acelerador que se carga en el constructor/OnCreate
/etc.) y regresar FALSE
-- si TranslateAccelerator
devuelto 0 - o TRUE
- Si devolviera algo más. Esto permite el uso de atajos de teclado que son específicos de las ventanas de Scintilla).
Por cierto, ambos métodos coexisten bastante felizmente, por lo que algunas clave se pueden manejar con aceleradores y algunos con WM_KEYDOWN
. Mi último programa de Scintilla hizo esto; No puedo recordar por qué, me temo, pero ciertamente funcionó bien.
Otros consejos
Bueno, si todo lo demás falla, podría subclase el procedimiento de ventana del control de Scintilla. Sería bastante sencillo interceptar los mensajes wm_keydown y wm_keyup, filtrarlos y luego pasarlos a la ventana principal de Scintilla Proc o a la ventana de su padre.