Hallo Ihr Lieben,
ich hab mal wieder eine Frage zum guten alten GDI, ich habe eine neue Klasse erstellt, diese von Button erben lassen und zeichne natürlich auch etwas drauf
Ich habe versucht einen "Hover-Effect" und einen "Klick-Effekt einzubauen" hierfür wechsle ich aktuell einfach bei "MouseEnter", "MouseDown", "MouseLeave" und "MouseUP" die Hintergrundfarbe. Das Problem ist, wenn ich mit dem Button z.B. eine MessageBox öffne, bleibt nach dem schließen der MessageBox, die Farbe auf der "KlickFarbe", da der Button anscheinend das MouseLeaveEvent nicht mehr mitkriegt. Kennt jemand zufällif einen Weg um dieses Verhalten zu Umgehen ?
Hier der Aktuell verwendete Code (Neue Klasse, erbt von Button)
Spoiler anzeigen
ich hab mal wieder eine Frage zum guten alten GDI, ich habe eine neue Klasse erstellt, diese von Button erben lassen und zeichne natürlich auch etwas drauf
Ich habe versucht einen "Hover-Effect" und einen "Klick-Effekt einzubauen" hierfür wechsle ich aktuell einfach bei "MouseEnter", "MouseDown", "MouseLeave" und "MouseUP" die Hintergrundfarbe. Das Problem ist, wenn ich mit dem Button z.B. eine MessageBox öffne, bleibt nach dem schließen der MessageBox, die Farbe auf der "KlickFarbe", da der Button anscheinend das MouseLeaveEvent nicht mehr mitkriegt. Kennt jemand zufällif einen Weg um dieses Verhalten zu Umgehen ?
Hier der Aktuell verwendete Code (Neue Klasse, erbt von Button)
VB.NET-Quellcode
- Imports System.Drawing
- Imports System.Drawing.Drawing2D
- Imports System.Drawing.Text
- Public Class DKButton
- Inherits Windows.Forms.Button
- Private MouseState As MouseState = MouseState.None
- Public Sub New()
- Me.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.UserPaint, True)
- DoubleBuffered = True
- Me.UpdateStyles()
- End Sub
- Dim _HoverColor As Color = Color.DimGray
- Public Property HoverColor As Color
- Get
- Return _HoverColor
- End Get
- Set(value As Color)
- _HoverColor = value
- Invalidate()
- End Set
- End Property
- Dim _ClickColor As Color = Color.OrangeRed
- Public Property ClickColor As Color
- Get
- Return _ClickColor
- End Get
- Set(value As Color)
- _ClickColor = value
- Invalidate()
- End Set
- End Property
- Dim _Border As Boolean = True
- Property Border As Boolean
- Get
- Return _Border
- End Get
- Set(value As Boolean)
- _Border = value
- Invalidate()
- End Set
- End Property
- Dim _BorderColor As Color = Color.Black
- Public Property BorderColor As Color
- Get
- Return _BorderColor
- End Get
- Set(value As Color)
- _BorderColor = value
- Invalidate()
- End Set
- End Property
- Dim _Hatch As Boolean = True
- Property Hatch As Boolean
- Get
- Return _Hatch
- End Get
- Set(value As Boolean)
- _Hatch = value
- Invalidate()
- End Set
- End Property
- Dim _HatchColor As Color = Color.Gray
- Property HatchColor As Color
- Get
- Return _HatchColor
- End Get
- Set(value As Color)
- _HatchColor = value
- Invalidate()
- End Set
- End Property
- Dim _GlassEffect As Boolean = True
- Property GlassEffect As Boolean
- Get
- Return _GlassEffect
- End Get
- Set(value As Boolean)
- _GlassEffect = value
- Invalidate()
- End Set
- End Property
- Dim _GlassEffectColor As Color = Color.White
- Property GlassEffectColor As Color
- Get
- Return _GlassEffectColor
- End Get
- Set(value As Color)
- _GlassEffectColor = value
- Invalidate()
- End Set
- End Property
- Private Function GetTextPosition(ByVal TextSize As SizeF) As PointF
- Dim DrawToRect As Rectangle = New Rectangle(0, 0, Me.Width, Me.Height)
- Return New PointF(((DrawToRect.Width \ 2) - (CInt(TextSize.Width) \ 2)), ((DrawToRect.Height \ 2) - (CInt(TextSize.Height) \ 2)))
- End Function
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- With e.Graphics
- .TextRenderingHint = TextRenderingHint.ClearTypeGridFit
- .SmoothingMode = SmoothingMode.AntiAlias
- .InterpolationMode = InterpolationMode.HighQualityBicubic
- .CompositingQuality = CompositingQuality.HighQuality
- .PixelOffsetMode = PixelOffsetMode.HighQuality
- Dim tmp_Color As Color = Color.DarkGray
- Select Case MouseState
- Case Helpers.MouseState.None
- tmp_Color = Me.BackColor
- Case Helpers.MouseState.Over
- tmp_Color = _HoverColor
- Case Helpers.MouseState.Pressed
- tmp_Color = _ClickColor
- End Select
- Using BackgroundBrush As New SolidBrush(tmp_Color)
- .FillRectangle(BackgroundBrush, New Rectangle(0, 0, Width, Height))
- End Using
- If _Hatch Then
- Using HatchBrush As New HatchBrush(HatchStyle.DarkDownwardDiagonal, Color.FromArgb(75, _HatchColor), Color.Transparent)
- .FillRectangle(HatchBrush, New Rectangle(0, 0, Width, Height))
- End Using
- End If
- If _GlassEffect Then
- Using GlassEffectBrush As New LinearGradientBrush(New Rectangle(0, 0, Me.Width, Me.Height \ 2), Color.FromArgb(180, _GlassEffectColor), Color.FromArgb(25, _GlassEffectColor), LinearGradientMode.Vertical)
- .FillRectangle(GlassEffectBrush, New Rectangle(0, 0, Width, Height \ 2))
- End Using
- End If
- If _Border Then
- Using BorderBrush As New SolidBrush(_BorderColor)
- Using BorderPen As New Pen(BorderBrush, 2)
- .DrawRectangle(BorderPen, New Rectangle(0, 0, Width, Height))
- End Using
- End Using
- End If
- Using ButtonTextBrush As New SolidBrush(ForeColor)
- .DrawString(Text, Font, ButtonTextBrush, GetTextPosition(.MeasureString(Text, Font)), StringFormat.GenericDefault)
- End Using
- End With
- End Sub
- Protected Overrides Sub OnMouseEnter(e As EventArgs)
- MyBase.OnMouseEnter(e)
- Invalidate()
- MouseState = Helpers.MouseState.Over
- Invalidate()
- End Sub
- Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
- MyBase.OnMouseDown(e)
- Invalidate()
- MouseState = Helpers.MouseState.Pressed
- Invalidate()
- End Sub
- Protected Overrides Sub OnMouseLeave(e As EventArgs)
- MyBase.OnMouseEnter(e)
- Invalidate()
- MouseState = Helpers.MouseState.None
- Invalidate()
- End Sub
- Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
- Dim R As Rectangle = New Rectangle(0, 0, Width, Height)
- If R.Contains(e.Location) Then
- MyBase.OnMouseUp(e)
- Invalidate()
- MouseState = Helpers.MouseState.Over
- Invalidate()
- Else
- MyBase.OnMouseUp(e)
- Invalidate()
- MouseState = Helpers.MouseState.None
- Invalidate()
- End If
- End Sub
- End Class
- Public Class Helpers
- Public Enum MouseState
- None
- Over
- Pressed
- End Enum
- End Class
If Energy = Low Then
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If