2012-05-04 16 views
1

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

コントロールとダイアログはすべてWS_CHILDで作成されます。コントロールはダイアログボックスの外にあり、ダイアログボックスはエディットボックスの外にあります。

コントロールの使用後にフォーカスを戻してみましたが、親ウィンドウが消えてちらつき、フォーカスを取り戻します。基本的には、スクロールバーをクリックしたりドラッグしたりできるコンボボックスのようなものが必要ですが、キーボード入力はスクロールバーだけでなくダイアログ自体にも残ります。

答えて

1

私はこのようなことをずっとやっていないので、何百もの細部はあると確信していますが、開始点はWM_MOUSEACTIVATEの処理を上書きすることです。

1

あなたが説明した子供と親の関係について少し混乱しています。 あなたは何を意味するか説明することができます:CDialogのは、私はクライアント領域の内側に他のウィンドウをホスティングしている任意のウィンドウがそれらの親であるすべての回

でフォーカスを維持したいエディットボックスのオフに親である 窓。他のウィンドウに含まれているWS_CHILDを除いてウィンドウを作成することはできません。 したがって、すべてのダイアログのコントロールはこのダイアログの子です。子ウィンドウが別の子ウィンドウをホストする可能性もあります。

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

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

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

おそらく可能ですが、多くのコーディングが必要になります。おそらくメッセージをフックすることは仕事をするだろうが、私はそれがストリームに対して行くだろうと思う。

+0

質問者は、ダイアログボックスの 'hwndParent'が、まだ残っていなければならないエディットコントロールのウィンドウハンドルであることを意味すると思います。 –

+0

はい、私はその質問が親/子ではなく所有者/所有者を意味すると思います。これは、MSDNのマニュアルでさえ、用語の一般的な不明瞭さです。 –

関連する問題