2011-12-23 15 views
6

コンボボックスのような機能を持つ.netフォームコントロールを実装しようとしていますが、アイテムのリストを展開するためにフォーム上のどこかでマウスイベントを傍受する適切な方法がわかりません。コンボボックスは、リストアイテムを表示するときに、マウスイベントをフォームのどこにでも傍受してリストを隠すにはどうすればいいですか?

リストが表示されている間に他のコントロールがマウスイベントに応答しないようにするにはどうすればよいですか?

フォームのどこにでもマウスクリックイベントを効率的かつ安全にキャッチして、拡張リストを非表示にするにはどうすればよいですか?

+0

ここで別の解決策を見つけることができます:http://stackoverflow.com/a/15305176/1522062 –

答えて

6

ToolStripDropDownと一緒にToolStripControlHostを使用すると、ComboBoxと同じように動作します。マウスイベントの処理について心配する必要はありません。私は前にこれを使用しました

:フォーム上のButtonコントロールと

Private Sub ShowControl(ByVal fromControl As Control, ByVal whichControl As Control) 
    '\\ whichControl needs MinimumSize set:' 
    whichControl.MinimumSize = whichControl.Size 

    Dim toolDrop As New ToolStripDropDown() 
    Dim toolHost As New ToolStripControlHost(whichControl) 
    toolHost.Margin = New Padding(0) 
    toolDrop.Padding = New Padding(0) 
    toolDrop.Items.Add(toolHost) 
    toolDrop.Show(Me, New Point(fromControl.Left, fromControl.Bottom)) 
End Sub 

クイックデモ:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
    ShowControl(Button1, New MonthCalendar) 
End Sub 

あなたのタイトルに質問に答えるために、私はのPInvoke呼び出しを考えるSetCaptureRelease Captureは、そのタイプの機能を処理するために使用されます。

1

Control.Capture

文書で説明したように(他の誰かがそれをキャプチャするまで - それは悪い形だが)、あなたは今、マウスの「オーナー」。あなたはすべてのマウスメッセージを受け取り、あなたのコントロールに「ダウン」を処理して、却下することができます。

+0

これは半分の作業しかないようです。マウスキャプチャを使用してコントロール内のすべてのコントロールが機能しなくなります。たとえば、キャプチャが解放されるまで、マウスキャプチャを使用したリストボックス内のスクロールバーは機能しません。 –

関連する問題