私はいくつかの項目を含むメニューを持っていますが、すべてタブショートカットを使用してアクセラレータショートカットを定義しています。このように:wxTextCtrl内のアクセラレータキーを傍受する
Increase volume\tCtrl+Up
これまでのところとても良いです。しかし、私のアクセラレータのうちの2つはショートカットCtrl + LeftとCtrl + Rightをそれぞれ使用します。私の問題は、TextCtrlに焦点を当てている間、それらのショートカットにはすでに期待された機能があることです。テキストフィールドでは、Ctrl +左とCtrl +右が単語でナビゲートする必要があります。私のユーザーの大半は、キーボードを非常に重く使用するので、これらの機能が期待どおりに機能することが重要です。
これまでは、すべてのキーがアクセラレータの使用のために処理される前に、wxEVT_CHAR_HOOKのハンドラをバインドすることによってすべてのキーを傍受することができました。しかし、私はその点をどのように先行するかについてはあまりよく分かりません。 TextCtrlに渡すショートカットセットを定義したいが、TextCtrl固有の関数がない場合は、他のアクセラレータが正常に処理できるようにしたい。たとえば、Ctrl +左とCtrl +右はTextCtrlで処理する必要があります。その理由は、単語でナビゲートするためですが、Ctrl + Oは関連付けられたメニューコマンドをトリガーする必要があります。
アプリケーションでユーザーがアクセラレータをインタラクティブに変更できるようにするため、ショートカットをCtrl + LeftではなくAlt + Leftに変更することはできません。関連するアクセラレータショートカットがTextCtrl内で目的の機能を実行しないため、TextCtrlにフォーカスがあるときに問題のあるメニュー項目を無効にすることもできません(つまり、アクセラレータCtrl + Leftでメニュー項目を無効にすると魔法のようにTextCtrlはそのキーの組み合わせを適切に処理します)。後者の点はwxのバグのようですが、それはどのようなものですか。
@ JamesSholesので、ユーザーが「Ctrl + X」を何かに定義することを決めた場合、そのような状況をどのように処理しますか?私はあなたが何か別のアクセラレータを定義する必要があると思うテキストctrlに焦点がある場合。または、テキストコントロールから派生し、キーボードハンドラを再定義します。 – Igor
Windowsでは、ユーザーがCtrl + Xをアクセラレータとして使用することを選択した場合、テキストコントロールがWM_CUTメッセージをインターセプトするため、アクセラレータとして機能しません。私は他のプラットフォームでの動作がどうなるか分かりません。いずれにしても、TextCtrlをサブクラス化してもKeyDown機能に単純に達していないため違いはありません。キーを処理するための解決順序は、wxEVT_HOOK→アクセラレータテーブル→wxEVT_KEY_DOWNとなります。 TextCtrlにフォーカスがあるときにアクセラレータテキストを変更する提案は興味深いものです。私はそれにいくつかの考えを与えるでしょう。コメントありがとう! –