2017-05-21 4 views
1

私はいくつかの項目を含むメニューを持っていますが、すべてタブショートカットを使用してアクセラレータショートカットを定義しています。このように: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のバグのようですが、それはどのようなものですか。

+0

@ JamesSholesので、ユーザーが「Ctrl + X」を何かに定義することを決めた場合、そのような状況をどのように処理しますか?私はあなたが何か別のアクセラレータを定義する必要があると思うテキストctrlに焦点がある場合。または、テキストコントロールから派生し、キーボードハンドラを再定義します。 – Igor

+0

Windowsでは、ユーザーがCtrl + Xをアクセラレータとして使用することを選択した場合、テキストコントロールがWM_CUTメッセージをインターセプトするため、アクセラレータとして機能しません。私は他のプラットフォームでの動作がどうなるか分かりません。いずれにしても、TextCtrlをサブクラス化してもKeyDown機能に単純に達していないため違いはありません。キーを処理するための解決順序は、wxEVT_HOOK→アクセラレータテーブル→wxEVT_KEY_DOWNとなります。 TextCtrlにフォーカスがあるときにアクセラレータテキストを変更する提案は興味深いものです。私はそれにいくつかの考えを与えるでしょう。コメントありがとう! –

答えて

1

Windowsでこの問題が発生した場合は、wxWindow::MSWShouldPreProcessMessage()を無効にし、問題のキーの組み合わせに対してfalseを返すと修正されます。しかし、これはC++の唯一の解決策ですが、wxPhoenixでもPythonの仮想メソッドをオーバーライドする方法が提供されているかどうかはわかりません。

おそらく、wxTextCtrl::MSWShouldPreProcessMessage()のライブラリバージョンはすでにこれを実行しているはずです。したがって、おそらくwxWidgets自体を変更することができます。

+0

本当に便利です、ありがとうございます。私はwxPythonの人で、C++で手抜きしていませんが、私は確かにパッチを提出することを検討します。あなたが指しているコードは、あまり複雑ではないようです。一つの懸案事項は、 'wxTextCtrl :: MSWShouldPreProcessMessage'を修正した後でさえ、一文字のアクセラレータが依然として亀裂から落ちるということです。 –

関連する問題