Cursor über dynamischen ControlContainer abfragen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Cursor über dynamischen ControlContainer abfragen

    Hallo Leute!

    Ich suche eine Möglichkeit, wie ich überprüfen kann, ob sich die Maus bei schnellen Bewegungen über einem ControlContainer befindet oder nicht. Der Container enthält ein TableLayoutPanel, in dem sich zwei Buttons und zwei Label befinden. Das Control hat folgenden Aufbau:
    • Container (UserControl) : Padding All = 2
      • TableLayoutPanel (TableLayoutPanel) : DockStyle = Fill
        • Button1 (Button)
        • Label1 (Label)
        • Label2 (Label)
        • Button2 (Button)

    Funktionsweise:
    • Zustand1: Maus über Container (ControlContainer ausgewählt) -> BackColor = Green; Button2 = sichtbar
    • Zustand2: Maus nicht über Container (ControlContainer nicht ausgewählt) -> BackColor = Standard; Button2 = unsichtbar

    Mein Code:

    VB.NET-Quellcode

    1. Property IsSelected = False 'für weiteren Ablauf erforderlich
    2. 'Zustand 1
    3. Sub Container_MouseEnter (...) Handler JedesControl.MouseEnter
    4. Me.IsSelected = True
    5. Me.BackColor = Green
    6. Button2.Visible = True
    7. End Sub
    8. 'Zustand2
    9. Sub Container_MouseLeave (...) Handler JedesControl.MouseLeave
    10. Me.IsSelected = False
    11. Me.BackColor = SystemColors.Control
    12. Button2.Visible = False
    13. End Sub


    Zustand1 ist kein Problem. Bei Zustand2 hab ich Probleme. Verknüpfe ich jedes Steuerelemnt mit dem dem MouseLeave-Handler, bekomme ich logischerweise eine Endlosschleife, sobald ich die Maus auf Button2 bewege. Füge ich dem Sub Container_MouseLeave nur den Handler MyBase.MouseLeave hinzu, ändert sich der Zustand des Containers nicht, wenn ich die Maus zu schnell über den Container bewege. Das heist, der Container wird unter Umständen als aktiv angezeigt, obwohl sich die Maus schon gar nicht mehr darüber befindet. Ich hab die Handler schon hin- und hergeschoben, MouseMove, Application.DoEvents, Container.SetStyle und Ähnliches ausprobiert. Aber es gelingt mir nicht, die Anzeige des Containers so hinzubekommen, dass er auch richtig angezeigt wird bei schnellen Mausbewegungen.

    Für Eure Hilfe und Ideen wäre ich sehr dankbar.
    Sehe ich das richtig, dass ich auf diese Weise die Events, die die einzelnen Steuerelemente auslösen würden, nach Belieben ein- und ausschalten kann? Ganz schön anspruchsvoller Code muss ich zugeben, wenn ich mein gefährliches Halbwissen so betrachte :whistling: .
    Du kannst auch eine gemeinsame Routine MouseEnter / MouseLeave für alle betreffenden Controls schreiben und dann das Sender-Argument fragen, welches Objekt es ist:

    VB.NET-Quellcode

    1. Sub Container_MouseEnter (...) Handler Control1.MouseEnter, Control2.MouseEnter, Control3.MouseEnter, Control4.MouseEnter, ...
    2. If sender Is Control1 Then
    3. ' was tun
    4. Else If sender Is Control1 Then
    5. ' was tun
    6. Else If sender Is Control2 Then
    7. ' was tun
    8. Else If sender Is Control3 Then
    9. ' was tun
    10. ' ...
    11. End If
    12. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!