2009-12-30 5 views
0

Я бы хотел, чтобы Scintilla игнорировала некоторые комбинации клавиш, такие как Ctrl + Enter или Ctrl + D, и чтобы уведомить родительское окно, когда они введены. Я прочитал документацию и не мог понять, как это сделать. Это возможно?Можно ли сообщить Scintilla игнорировать некоторые нажатия клавиш и передать их в родительское окно?

+0

В LIVEditor я перехватываю ключевые события, прежде чем они попадут в редактор. –

ответ

1

На самом деле есть два варианта. Присоединение к WM_KEYDOWN, как и было предложено, является одним. Другая - использовать таблицу ускорителей (см. http://msdn.microsoft.com/en-us/library/ms645526(VS.85).aspx) для перевода нажатий клавиш в идентификаторы команд более высокого уровня и обработки идентификаторов команд в вашем обработчике WM_COMMAND.

Использование таблицы ускорителей, несомненно, является «правильным», но WM_KEYDOWN, похоже, работает так же хорошо, и не требует изменения кода цикла сообщений/отслеживания функции магической структуры, которая должна быть переопределена/etc.

(При использовании MFC, волшебное рамочного функцию окна конкретных таблиц акселератора CWnd::PreTranslateMessage. Override его, вызовите TranslateAccelerator там (переходящий в таблице ускорителя, который загружается в конструкторе/OnCreate/и др.) И вернуть FALSE - если TranslateAccelerator возвращается 0 - или TRUE - если он возвращается что-то другое Это позволяет использовать сочетания клавиш, которые являются специфическими для SCINTILLA окон)

Кстати, обе эти методы сосуществуют вполне счастливо, поэтому некоторые из них.. нажатия клавиш можно обрабатывать с помощью ускорителей, а некоторые - с WM_KEYDOWN. Моя последняя программа Scintilla сделала это; Я совершенно не могу вспомнить, почему, боюсь, но это, безусловно, сработало.

+0

Если вы используете диалоги (то есть с DialogBoxParam), я настоятельно рекомендую использовать метод перехвата вместо ускорителей, потому что сложнее вводить ускоритель в насос сообщений, чем подключать окно. –

2

Ну, если все остальное не удается, вы можете подклассифицировать процедуру окна управления Scintilla. Было бы довольно просто перехватить сообщения WM_KEYDOWN и WM_KEYUP, отфильтровать их, а затем передать их либо в главный прогон окна Scintilla, либо в родительское окно.

+0

Я быстро протестировал этот подход, используя информацию, которую я нашел в следующей статье: http://www.aaronballman.com/programming/REALbasic/WindowSubclassingArticle.php. Кажется, он работает нормально. Я проголосовал за вас, и если вы не получите более подробный ответ Синтиллы через пару дней, я соглашусь с этим. Благодарю. –

+0

Да, я не мог найти ничего хорошего в документации. Удачи. – ChrisV

 Смежные вопросы

  • Нет связанных вопросов^_^