2009-07-13 5 views
0

テンプレートから作成したダイアログがあります。アクセラレータ(のは、それがAltキーだふりをしましょう) 無効なコントロールのアクセラレータを扱うにはどうすればよいですか?

  • OKエディットボックス
    • いくつかの無関係なコントロール
    • ラベルと:それは、次の順序でテンプレートに記載されているコントロールを持っています私はヒット時に通常のボタンに

    をキャンセルのAlt- keybordフォーカスがエディットボックスに転送される - 必要に応じて同じように。ただし、編集ボックスを無効にする必要があることがあります。

    編集ボックスが無効になっているときにAlt-Aを押した場合、効果は[OK]ボタンが押されていることになります。この場合は何もしないでください。これを回避するには何ができますか?

  • 答えて

    0

    私はMFCとそれほど慣れていないので、私は一般的な用語でお答えしようとしています:

    限り、私はそれを作ることができるように、何が起こることは、あなたが、いわゆるアクセラレータが競合しているということです。 Aは、編集ボックスのアクセラレーションキーです。ここでは - Applyボタンを推測しています。

    解決策は、このような状況を回避することです。あいまいなアクセルキーは、あなた自身が発見したように、ユーザーのためのPITAです。したがって、KDEでは、ヒューリスティックに基づいて実行時にアクセルキーを割り当てる自動化機能があります。それはしばしば十分ですが、ときには最適ではない結果が得られます。

    フォームデザイナーのフォームを使用してコントロールを視覚的にレイアウトする場合、これらのツールでは通常、アクセラレーションキーの競合をチェックする方法があります。それ以外の場合は、昔に戻って、テスト中にすべての加速キーをクリックして、期待通りに動作するかどうかを確認します。

    ただし、同じスコープ内で重複アクセラレーションキーが発生しないようにしてください。

    +1

    私は何も複製しません。問題は、アクセラレータが次の無効化されていないコントロールをトリガすることです。 editboxが有効になっているときは、次の非無効コントロールです。無効にすると、OKボタンは次に無効になっていないコントロールになります。 – sharptooth

    0

    編集ボックスを有効/無効にすると、アクセラレータでラベルコントロールを有効/無効にするか、ウィンドウテキストを変更してラベルにアクセラレータを追加/削除することもできます。どちらもあなたに望ましい動作を与えるはずです。

    +0

    ラベルを無効にすると、グレー表示になります。私の場合は適切ではありません。そして、テキストを微調整するのは恐ろしいことです。この方法で調整した各ラベルテキストのアンパサンド記号の位置を覚えておく必要があります。恐ろしいですが、うまくいくでしょう。 – sharptooth

    +0

    ラベルに文字列リソースを使用している場合は、アンパサンドで値を設定し、有効にした場合はその値を使用し、無効にするときは単にアンパサンドを削除します。ポジションを覚えていない。 –

    +0

    私は実際にダイアログテンプレートに静的コントロールとして定義されたラベルを持っています。このようにすれば、アクセラレータが再び機能するように、従属制御を有効にするためにアンパサンドの場所を覚えておく必要があります。 – sharptooth

    0

    私はこれを試しましたが、うまくいくように見えました...しかし、それはやっかいな方法です。

    編集コントロールの後に、ボタン(任意のサイズ)をドロップします。ボタンのプロパティを「Owner Draw」に変更しますが、実際に描画ロジックは実装しません。また、タブオーダーが編集コントロールの直後になるように設定されていることを確認してください。

    これは、実行時にボタンが見えないようにする効果があります。編集コントロールが無効になっていると、不可視ボタンは実際には何の効果もないようトリガーされます。

    :コントロールを非表示にする可能性があるだけでなく、コントロールがタブ順に表示されないように、WS_VISIBLEをボタンから削除(または非表示または無効)することはできません。

    このコントロールを使用すると、編集コントロールが無効になっているときにアクセラレータを叩いたときに、フォーカスが表示されなくなります(目に見えないボタン上にあるため)。これが気に入らない場合は、新しい非表示ボタンにハンドラを追加して、エディットコントロールが無効の場合にフォーカスをどこに設定します。そうすることで、アクセラレータはボタンをクリックし、ハンドラを起動します。ハンドラは、どこにフォーカスを戻します。

    希望すると便利です。

    0

    私はMFCとWindows SDKで作業して以来、長いことがありましたが、アーキテクチャの観点から見ると、あなたがフックできるイベントハンドラが必要です。編集ボックスが無効のときに内部フラグを保持する。編集ボックスが無効になっている場合、Alt-Aイベントを食べる。

    関連する問題