Guten Abend,
Ich habe einen Button auf meiner Form, welcher ein normales Event ausführt (in dem Fall addiert er die Zahl +1 mit jedem Klick und wenn er bei 6 angekommen ist, stellt er sich automatisch wieder auf 0). Ja, ist nicht der beste Code, darum habe ich mich aber in der kurzen Zeit nicht sonderlich gekümmert. Jedenfalls führt der Button bei einem schnell Klick das Event nur einmal aus (obwohl man zweimal geklickt hat). Unten seht ihr ein GIF, wo man es super sieht. Während ich jedoch die Maus beim klicken bewege, wird akkurat bei jedem Klick auch das Event ausgeführt. Meine Vermutung ist, dass die Bewegung der Maus beim Control etwas updated, ich kann mir beim besten Willen jedoch nicht vorstellen, was es ist. Habt ihr da vielleicht eine Lösung?
Button Control:
Spoiler anzeigen
Ich habe einen Button auf meiner Form, welcher ein normales Event ausführt (in dem Fall addiert er die Zahl +1 mit jedem Klick und wenn er bei 6 angekommen ist, stellt er sich automatisch wieder auf 0). Ja, ist nicht der beste Code, darum habe ich mich aber in der kurzen Zeit nicht sonderlich gekümmert. Jedenfalls führt der Button bei einem schnell Klick das Event nur einmal aus (obwohl man zweimal geklickt hat). Unten seht ihr ein GIF, wo man es super sieht. Während ich jedoch die Maus beim klicken bewege, wird akkurat bei jedem Klick auch das Event ausgeführt. Meine Vermutung ist, dass die Bewegung der Maus beim Control etwas updated, ich kann mir beim besten Willen jedoch nicht vorstellen, was es ist. Habt ihr da vielleicht eine Lösung?
Button Control:
VB.NET-Quellcode
- Class VisualButton : Inherits Control
- #Region " Variables"
- Private W, H As Integer
- Private _Rounded As Boolean = False
- Private State As MouseState = MouseState.None
- Private _None As Image = Nothing
- Private _Over As Image = Nothing
- Private _Down As Image = Nothing
- #End Region
- #Region " Properties"
- #Region " Colors"
- <Category("Colors")>
- Public Property BaseColor As Color
- Get
- Return _BaseColor
- End Get
- Set(value As Color)
- _BaseColor = value
- End Set
- End Property
- <Category("Colors")>
- Public Property TextColor As Color
- Get
- Return _TextColor
- End Get
- Set(value As Color)
- _TextColor = value
- End Set
- End Property
- <Category("Options")>
- Public Property Rounded As Boolean
- Get
- Return _Rounded
- End Get
- Set(value As Boolean)
- _Rounded = value
- End Set
- End Property
- <Category("Visual")>
- Public Property Over As Image
- Get
- Return _Over
- End Get
- Set(value As Image)
- _Over = value
- End Set
- End Property
- <Category("Visual")>
- Public Property None As Image
- Get
- Return _None
- End Get
- Set(value As Image)
- _None = value
- End Set
- End Property
- <Category("Visual")>
- Public Property Down As Image
- Get
- Return _Down
- End Get
- Set(value As Image)
- _Down = value
- End Set
- End Property
- #End Region
- #Region " Mouse States"
- Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
- MyBase.OnMouseDown(e)
- State = MouseState.Down : Invalidate()
- End Sub
- Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
- MyBase.OnMouseUp(e)
- State = MouseState.Over : Invalidate()
- End Sub
- Protected Overrides Sub OnMouseEnter(e As EventArgs)
- MyBase.OnMouseEnter(e)
- State = MouseState.Over : Invalidate()
- End Sub
- Protected Overrides Sub OnMouseLeave(e As EventArgs)
- MyBase.OnMouseLeave(e)
- State = MouseState.None : Invalidate()
- End Sub
- #End Region
- #End Region
- #Region " Colors"
- Private _BaseColor As Color = _FlatColor
- Private _TextColor As Color = Color.FromArgb(243, 243, 243)
- #End Region
- Sub New()
- SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or
- ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoubleBuffer Or
- ControlStyles.SupportsTransparentBackColor, True)
- DoubleBuffered = True
- Size = New Size(106, 25)
- BackColor = Color.Transparent
- Font = New Font("Segoe UI", 12)
- Cursor = Cursors.Hand
- BackgroundImage = _None
- End Sub
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- B = New Bitmap(Width, Height) : G = Graphics.FromImage(B)
- W = Width - 1 : H = Height - 1
- Dim GP As New GraphicsPath
- Dim Base As New Rectangle(0, 2, W, H)
- With G
- .SmoothingMode = 2
- .PixelOffsetMode = 2
- .TextRenderingHint = 5
- .Clear(BackColor)
- Select Case State
- Case MouseState.None
- Me.BackgroundImage = _None
- Case MouseState.Over
- Me.BackgroundImage = _Over
- Case MouseState.Down
- Me.BackgroundImage = _Down
- End Select
- '-- Text
- .DrawString(Text, Font, New SolidBrush(_TextColor), Base, CenterSF)
- End With
- MyBase.OnPaint(e)
- G.Dispose()
- e.Graphics.InterpolationMode = 7
- e.Graphics.DrawImageUnscaled(B, 0, 0)
- B.Dispose()
- End Sub
- End Class
Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.