Scintilla が Ctrl+Enter や Ctrl+D などの特定のキーの組み合わせを無視し、それらが入力されたときに親ウィンドウに通知するようにしたいと考えています。ドキュメントを読みましたが、これを行う方法がわかりませんでした。これは可能ですか?
2 に答える
まあ、他のすべてが失敗した場合は、Scintilla コントロールのウィンドウ プロシージャをサブクラス化できます。WM_KEYDOWN および WM_KEYUP メッセージをインターセプトし、それらをフィルター処理してから、メインの Scintilla ウィンドウ プロシージャまたは親ウィンドウに渡すのはかなり簡単です。
実は2つの選択肢があります。WM_KEYDOWN
提案されているように、へのフックはその 1 つです。もう 1 つは、アクセラレータ テーブル ( http://msdn.microsoft.com/en-us/library/ms645526(VS.85).aspxを参照) を使用して、キー押下を上位レベルのコマンド ID に変換し、コマンド ID を処理することです。あなたのWM_COMMAND
ハンドラで。
アクセラレータ テーブルを使用することは間違いなく「正しい」方法ですがWM_KEYDOWN
、同様に機能するようであり、メッセージ ループ コードを変更したり、オーバーライドする必要がある魔法のフレームワーク関数を追跡したりする必要はありません。
(MFC を使用している場合、ウィンドウ固有のアクセラレータ テーブルの魔法のフレームワーク関数は ですCWnd::PreTranslateMessage
。それをオーバーライドし、そこで呼び出しTranslateAccelerator
て (constructor/ OnCreate
/etc にロードされたアクセラレータ テーブルを渡します)、戻ります -- 0 が返されたFALSE
場合TranslateAccelerator
-- またはTRUE
-- それ以外のものが返された場合. これにより、Scintilla ウィンドウに固有のキーボード ショートカットを使用できるようになります。)
ちなみに、これらの方法はどちらも問題なく共存できるため、一部のキー押下はアクセラレータで処理でき、一部は で処理できますWM_KEYDOWN
。私の最後の Scintilla プログラムはこれを行いました。理由はまったく思い出せませんが、残念ながらうまくいきました。