2012-02-14 11 views
6

私はコンボボックスのドロップダウン(または、コンテキストメニューを含む他のドロップダウン)の動作をモデル化しようとしています。どこにフォーカスを当てることができないものでも、他の場所をクリックするとドロップダウンが閉じます。ComboBoxはドロップダウン時にどのようにマウスをキャプチャしますか?

私は、MouseCaptureChanged、LostFocus、Leaveなどのイベントを購読しようとしました。ドロップダウンとして機能するカスタムのUserControlがあり、ユーザーが他の場所をクリックしたときに閉じたいだけです。

これは多くのコントロールで行われているようですが、これを行う簡単な方法がないと驚いています。

これまで私が思いつくことができる複雑な方法は、pinvokeとSetCapture()関数を使用すること、またはMessageFilterを作成することです。これらが唯一の選択肢である場合は、どちらが良いか分かりません。

+2

制御のようなドロップダウンを実装するための簡単な方法は、ToolStripControlHostとToolStripDropDownを使用することです。 ComboBoxのように動作します。 [リスト項目を表示するときにコンボボックスをどのようにしてマウスイベントをフォーム上のどこにでも傍受してリストを隠すにはどうすればいいですか?](0120-18756) – LarsTech

+0

ToolStripControlHostを試しています。私はポップアップの上部に沿って醜い境界線を取り除くことはできません、またはあなたがドロップダウンを開くたびにComboBoxを点滅させることはできません。 –

+2

ToolStripContorlHostの余白とToolStripDropDownの余白を0に設定してください。コントロールの点滅は別の問題です。カスタムドロップダウンでComboBoxを使用しようとしていますか? – LarsTech

答えて

1

ComboBoxは2つのコントロールから構成されています。

  • 基地 - 可視アクティブでない(コントロール)
  • のDropDownList - 可視編集モードまたはリスト選択モード(ウィンドウまたはフォーム)中

通常ベースが見えます。ユーザーがComboBoxをクリックすると、ベースコントロールが非表示になり、DropDownListコントロールが表示されます。このスイッチはバックグラウンドで行われるため、ユーザーにとってはコントロールが拡張されたように見えます。

捕まえたいイベントは、ドロップダウンリストウィンドウで行います。クライアントエリアのどこかをクリックすると、DropDownListウィンドウは WM_KILLFOCUSイベントを受信します。これは WndProc(メッセージ%m)メソッドです。そして、親ウィンドウ(ベースコントロール) WPARAMと WM_COMMAND OCM_COMMAND)メッセージを送る= 526318 HIWORD(WPARAM)= 8)とベースのコントロールは、彼がDropDownListのウィンドウを非表示にする知っています。

したがって、追加のドロップダウンウィンドウを実装してWM_KILLFOCUSイベントをキャッチする必要があります。

0

あなたが言及したコントロールのテンプレートは、StaysOpenプロパティがfalseに設定されているコンテナとしてポップアップを表示します(これは私が思うところのデフォルトです)。

ComboBox template example

関連する問題