1

コントロール、いくつかの CButton、CScrollbar を含むモードレス CDialog があります。CDialog は、常にフォーカスを維持したい編集ボックスの親になっています。問題は、ユーザーがボタンまたはスクロールバーをクリックしてコントロールを使用するたびに、コントロールが編集ボックスからフォーカスを盗み、親ウィンドウがフォーカスなしで描画され (ヘッダー バーがグレー表示される)、コントロールがすべてのキーボード入力を取得します。コントロールがマウス操作に応答するが、フォーカスを盗まない方法はありますか?

コントロールとダイアログはすべて WS_CHILD で作成されます。コントロールはダイアログから親になり、ダイアログは編集ボックスから親になります。

コントロールが使用された後にフォーカスを元に戻そうとしましたが、親ウィンドウがちらつき、フォーカスが失われてから回復します。基本的に、スクロールバーをクリックまたはドラッグできるコンボボックスのように機能するものが必要ですが、キーボード入力はスクロールバーだけでなくダイアログ自体にも行われ、全体がフォーカスを失うことはありません。

4

2 に答える 2

1

あなたが説明した子供と親の関係について少し混乱しています。どういう意味ですか? CDialogは、常にフォーカスを維持したい編集ボックスから親になっています。

クライアントエリア内の他のウィンドウをホストしているウィンドウは、それらのウィンドウの親です。他のウィンドウに含まれているWS_CHILDなしでウィンドウを作成することはできません。したがって、すべてのダイアログのコントロールはこのダイアログの子です。子ウィンドウが別の子ウィンドウをホストしている可能性もあります。

CDialogは、ダイアログウィンドウの単なるMFC表現です。同じことが他のコントロールにも当てはまります。たとえば、CButtonは、ウィンドウボタンコントロールとして事前定義されているウィンドウのウィンドウのハンドルをラップするMFCクラスです。

空でない限り、ダイアログにフォーカスがありません(コントロールがありません)。ダイアログにコントロールが1つでも含まれている場合、このコントロールには常にフォーカスがあります。

フォーカスとは、特定のウィンドウがマウスとキーボードのメッセージを受信することを意味します。一度にフォーカスできるのは1つのコントロールだけです。スクロールバーでマウスクリックを処理したり、キーボードでスライダーを移動したりするには、スクロールバーにフォーカスが必要です。したがって、他のコントロールはそれをあきらめなければなりません。コンボボックスのドロップボックス(これはあなたが参照しているものだと思います)はダイアログの子ではありません。これは、その間キーボードフォーカスがあり、マウスをキャプチャするポップアップウィンドウです。ドロップダウンすると、ダイアログが非アクティブ化され、ドロップダウンが非表示になると、ダイアログの状態がアクティブに戻されるため、フォーカスが変更されることはなく、ダイアログが非アクティブ化されたときにフォーカスがあったコントロールに戻ります。

あなたがやろうとしていることはおそらく可能ですが、それは多くのコーディングを必要とします。おそらくメッセージをフックすることは仕事をするでしょう、しかし私はそれが流れに逆らうだろうと思います。

于 2012-05-04T21:46:18.083 に答える
1

私は長い間このようなことをしていないので、細かな点は無数にあると思いますが、出発点は の処理を​​オーバーライドすることだと思いますWM_MOUSEACTIVATE

于 2012-05-04T18:06:50.617 に答える