Benutzer mit den meisten Antworten
Für jedes Label in einer GroupBox MouseEnter und MouseLeave?

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
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
- Bearbeitet Tom Lambert (Koopakiller)Moderator Samstag, 8. November 2014 17:53
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 12. November 2014 08:13
- Als Antwort markiert Hiro3210 Donnerstag, 13. November 2014 16:39
Alle 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
- Bearbeitet Tom Lambert (Koopakiller)Moderator Samstag, 8. November 2014 17:53
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 12. November 2014 08:13
- Als Antwort markiert Hiro3210 Donnerstag, 13. November 2014 16:39
-
In der Methode wo lbl verwendet wird.
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 -
Kannst du mir vielleicht weiter helfen:
Bei deinem Code tritt ein Fehlverhalten auf, wenn man mit der Maus über einem Label am Rand ist, dann aus der GroupBox rausgeht und dann wieder auf das selbe Label geht, ohne ein anderes Label zu berühren. Dann entsteht zu dem Border vom rausgehen ein 2. Border der etwas versetzt zu dem ersten ist. Man müsste also den Border beim verlassen der GroupBox löschen...aber wie und wo mache ich das.
Sry dass das so spät kommt...
Viele Grüße
Hiro3212
-
Hallo,
abonniere dazu einfach das MouseLeave-Event von der GroupBox. Ich hatte diesen Effekt auch schon, konnte es aber über den WinAPI Zugriff lösen. Das hat oftmals auch viel mit probieren zu tun, zu 100% Verhindern kannst du solche Effekte oftmals gar nicht ohne das gesamte Label selbst neu zu implementieren. In WPF wäre das Ganze deutlich einfacher zu lösen.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