none
Für jedes Label in einer GroupBox MouseEnter und MouseLeave? RRS feed

  • Frage

  • Ich bin gerade dabei einen Kalender zu programmieren. Dazu habe ich für jeden Tag in einem Monat ein eigenes Label gemacht und alle Label in eine GroupBox getan. Nun bin ich am verzweifeln, wie ich es anstellen soll, dass man wenn man mit der Maus auf einen Tag geht (noch nicht klickt), dass dann ein Border um das Label angezeigt wird.

    Wie ich einen Border mache und so weiter ist klar, aber wie ich das für alle Labels in der GroupBox mache (es sind 42 Label), weiß ich nicht. 

    Gibt es überhaupt eine Möglichkeit und wenn, wie?

    Viele liebe Grüße von 

    Hiro3210

    Samstag, 8. November 2014 16:20

Antworten

  • Hallo und willkommen im Forum,
    du musst einfach von jedem Label die Events abonnieren. Das geht am Einfachsten in einer Schleife:

        Protected Overrides Sub OnLoad(e As EventArgs)
            MyBase.OnLoad(e)
    
            'Alle Labels der GroupBox durchlaufen'
            For Each lbl In GroupBox1.Controls.OfType(Of Label)()
                'Events abonnieren'
                AddHandler lbl.MouseEnter, AddressOf lbl_MouseEnter
                AddHandler lbl.MouseLeave, AddressOf lbl_MouseLeave
            Next
        End Sub
    
        Const WM_MOUSELEAVE = &H2A3
        Dim lastLabel As Label
        Private Sub lbl_MouseEnter(sender As Object, e As EventArgs)
            If Not lastLabel Is Nothing Then
                'Windows Vorspielen das die Maus das Label verlassen hat um den Border zu entfernen'
                'Dadurch wird der Focus etc. auch richtig gesetzt.'
                'Das damit behobene Fehlverhalten tritt ein, wenn man von Label zu Label springt ohne dir Form dahinter zu berühren'
                SendMessage(lastLabel.Handle, WM_MOUSELEAVE, IntPtr.Zero, IntPtr.Zero)
            End If
            'sender = auslösendes Objekt, also das Label'
            lastLabel = CType(sender, Label)
            'Border setzen:'
            lastLabel.BorderStyle = BorderStyle.FixedSingle
        End Sub
    
        Private Sub lbl_MouseLeave(sender As Object, e As EventArgs)
            Dim lbl = CType(sender, Label)
            lbl.BorderStyle = BorderStyle.None 'Border entfernen'
        End Sub
    
        <System.Runtime.InteropServices.DllImport("user32.dll")> _
        Public Shared Function SendMessage(hWnd As IntPtr, Msg As Int32, wParam As IntPtr, lParam As IntPtr) As System.IntPtr
        End Function
    


    Ich habe den Code noch etwas erweitert damit er besser funktioniert, sonst gibt es ab und zu Fehlverhalten.

    PS: Du weißt schon, das es ein vorgefertigtes MonthCalendar- bzw. DateTimePicker Control gibt, oder?


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets




    Samstag, 8. November 2014 17:51
    Moderator

Alle Antworten