2011-12-23 10 views
6

Próbuję zaimplementować formant formularza .net z funkcjonalnością podobną do pola kombi, ale nie znam właściwej metody przechwytywania zdarzeń myszy w dowolnym miejscu formularza, aby rozwinąć listę elementów.W jaki sposób pola kombi podczas wyświetlania elementów listy przechwytują zdarzenia myszy w dowolnym miejscu formularza, aby ukryć listę?

Jak uniemożliwić innym kontrolom reagowanie na zdarzenia myszy podczas wyświetlania listy?

Jak skutecznie i bezpiecznie przechwycić zdarzenie kliknięcia myszą w dowolne miejsce formularza, aby ukryć rozszerzoną listę?

+0

można znaleźć inne rozwiązanie tutaj: http://stackoverflow.com/a/15305176/1522062 –

Odpowiedz

6

Po prostu użyj ToolStripControlHost wraz z ToolStripDropDown, a będzie działać tak samo jak rozwijana lista ComboBox. Nie musisz się martwić obsługą zdarzeń myszy.

Użyłem tego wcześniej:

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 

Szybkie Demo z kontrolą przycisku na formularzu:

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

odpowiedzieć na pytanie w tytule, myślę połączeń pinvoke z SetCapture i Release Capture są używane do obsługi tego typu funkcji.

1

Control.Capture

Jak wyjaśniono w dokumentacji, teraz „Własny” mysz (aż ktoś chwyta go - choć to zła forma). Otrzymujesz wszystkie wiadomości od myszy i potrafisz obsłużyć "Down", a nie kontrolkę, aby je odrzucić.

+0

To wydaje się tylko w połowie pracy. Wszystkie kontrolki w sterowaniu za pomocą przechwytywania myszy przestają działać. Na przykład pasek przewijania w polu listy z przechwytywaniem myszy nie działa, dopóki nie zostanie zwolnione przechwytywanie. –

Powiązane problemy