0

私のアプリケーションには、サイド パネルにいくつかのコントロール (スライダー、ボタン、テキスト編集コントロール) を備えた大きなグラフィック領域があります。グラフィック領域は、いくつかのキーボード コマンドを認識します。

私の問題は、サイド パネルのコントロールがフォーカスされている場合、メイン グラフィックス領域がキーボード コマンドを受信しないため、ユーザーが混乱することです。ただし、一部のコントロール (テキスト編集コントロールなど) では、これは意図されたものです。

私が望むのは、可能な限り早い時期にフォーカスが自動的にグラフィックス領域に戻ることです (これを「貪欲な」フォーカスと呼びます)。たとえば、テキスト編集が終了したとき (Enter キー)、またはユーザーがアイテムを選択したときです。コンボボックス。

Windows API または Borland Vcl を使用して、問題に対処するためのクリーンで堅牢な戦略を探しています。

アイデアを共有していただければ幸いです。

4

2 に答える 2

0

私はまだ問題を完全に解決していませんが、フォーム レベルでインターセプトするのに非常に役立つメッセージはCM_DIALOGKEY(Borland Vcl のみ) です。UI 内を移動するために通常使用されるすべてのキーに対して送信されます。つまり、カーソル キー、タブとシフト タブ、Enter キー、その他のキーです。

CM_DIALOGKEYフォーカスをグラフィックス領域に戻し、キーの押下をそのコンポーネントに転送するためのイベント ハンドラーを追加しました。このようにして、ユーザーは引き続きキーボードを介して UI 要素を制御できますが (テキスト入力には重要)、カーソル キーはグラフィックス領域によって処理されます。

于 2012-10-19T12:31:11.647 に答える
0

私はいくつかの大きなアプリのシラミCAD / CAMで同様の問題を抱えていたという意味を知っています...

私のソリューションはシンプルで堅牢で、何年も使用しています。

1.そのgfx領域のすべてのキーストローク処理

  • 領域が配置されているフォームのイベントで実行する必要があります
  • パネルではなく、ペイントボックスは何でも...

2.フォーカス解除関数を作成します(できればフォームのメンバーですが、必須ではありません)

  • この関数は VCL アイテムのフォーカスを失います
  • 焦点は、あなたが望むものそのものを形成することに行きます
  • 私はこれを使用しています:

    //---------------------------------------------------------------------------
    void main_unfocus()
        {          
        Main->bt_unfocus->Visible=true;
        Main->bt_unfocus->SetFocus();
        Main->bt_unfocus->Visible=false;
        }
    //---------------------------------------------------------------------------
    
  • メインはフォームポインタです

  • bt_unfocus はボタンです (フォーカス可能な任意の VCL コンポーネントにすることができます)
  • 通常、このボタンはアプリの左上隅に配置し、サイズを 2x2 ピクセルに設定します
  • 最初は見えない
  • アイデアはそれにフォーカスを設定することです(ただし、最初にそれを再表示して、例外がスローされないようにします)
  • 非表示にしてフォーカスを失う
  • BCB5 および BDS2006 でうまく動作します (他の IDE では使用していません)。
  • ご覧のとおり、ほとんどの場合、このコンポーネントは非表示です

4. main_unfocus を呼び出すタイミングは?

  • gfx 領域の外側から内側にマウスを移動したとき (OnMouseMove イベント)
  • またはあなたがそれをクリックしたとき
  • また、フォーカスが gfx 領域にあるかどうかを記憶することとこれを組み合わせることができます
  • これは、OnExit などのイベントで実行できます ...
  • または、フォーカスが編集ボックス内にあるときに Esc を押すと ...\
  • 私はあなたがアイデアを理解し、これをあなたのニーズに合わせて調整すると確信しています

それが役に立てば幸い

于 2014-01-28T10:21:24.043 に答える