Imports System.Drawing.Drawing2D Public Class Android_Stock_ToggleSwitch Inherits Control Private T As Thumb Private Diff As Integer Private IsMouseDown As Boolean Public Event CheckedChanged(sender As Object) Private _checked As Boolean = False Public Property Checked As Boolean Get Return _checked End Get Set(value As Boolean) If value Then T.Rect.X = Width - T.Width Else T.Rect.X = 0 End If If _checked <> value Then _checked = value RaiseEvent CheckedChanged(Me) End If Invalidate() End Set End Property Sub New() MyBase.New() SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True) BackColor = Color.FromArgb(39, 40, 41) Width = 120 Height = 30 T = New Thumb(Width \ 2, Height) End Sub Protected Overrides Sub OnPaint(e As PaintEventArgs) MyBase.OnPaint(e) If T.Rect.X < 2 Then T.Rect.X = 2 If T.Rect.X > Width - T.Width Then T.Rect.X = Width - T.Width T.DrawThumb(e.Graphics, Check) End Sub Private Sub Toggler_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged T = New Thumb(Width \ 2, Height) If Checked Then T.Rect.X = Width - T.Width End If End Sub Private Sub Toggler_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown If e.Button = Windows.Forms.MouseButtons.Left AndAlso T.Rect.IntersectsWith(New Rectangle(e.Location.X, e.Location.Y, 1, 1)) Then Diff = e.Location.X - T.Rect.X IsMouseDown = True End If End Sub Private Sub Toggler_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove If IsMouseDown Then T.Rect.X = e.Location.X - Diff Invalidate() End If End Sub Private Sub Toggler_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp Checked = Check() IsMouseDown = False End Sub Private Sub Toggler_Click(sender As Object, e As MouseEventArgs) Handles Me.Click If e.Button = Windows.Forms.MouseButtons.Left Then If Checked = True Then Checked = False Else Checked = True End If End If End Sub Private Function Check() As Boolean Select Case True Case Checked And T.Rect.X - 1 <= Width / 4 Return False Case Checked And Not T.Rect.X - 1 <= Width / 4 Return True Case Not Checked And T.Rect.X - 1 >= Width / 4 Return True Case Not Checked And Not T.Rect.X - 1 >= Width / 4 Return False Case Else Return Checked End Select End Function Private Class Thumb Private Textformat As New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center} Private Schriftart As New Font("Microsoft Sans Serif", 12, FontStyle.Bold) Public Width As Integer Public Height As Integer Public Rect As Rectangle Sub New(width As Integer, height As Integer) Me.Width = width Me.Height = height Rect = New Rectangle(2, 2, width - 3, height - 5) End Sub Public Sub DrawThumb(g As Graphics, drawChecked As Boolean) Using GP As GraphicsPath = New GraphicsPath GetRoundedPath(Rect, 2, GP) g.TextContrast = 0 '0 bis 12 g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias g.InterpolationMode = InterpolationMode.HighQualityBicubic g.CompositingQuality = CompositingQuality.GammaCorrected g.SmoothingMode = SmoothingMode.HighQuality Using SB As New SolidBrush(Color.FromArgb(50, 255, 255, 255)) Using p As New Pen(SB, 1) If drawChecked Then 'ON g.FillPath(New SolidBrush(Color.FromArgb(7, 129, 170)), GP) 'Schieber füllen g.DrawString("ON", Schriftart, New SolidBrush(Color.FromArgb(189, 189, 189)), Rect, Textformat) 'Text zeichnen g.SmoothingMode = SmoothingMode.HighQuality Else 'OFF g.FillPath(New SolidBrush(Color.FromArgb(84, 85, 86)), GP) 'Schieber füllen g.DrawString("OFF", Schriftart, New SolidBrush(Color.FromArgb(189, 189, 189)), Rect, Textformat) 'Text zeichnen End If g.DrawLine(p, Rect.X + 2, 2, Rect.X + Rect.Width - 2, 2) End Using End Using End Using End Sub Private Function GetRoundedPath(re As Rectangle, r As Integer, GP As GraphicsPath) As GraphicsPath GP.AddLine(re.X + r, re.Y, re.X + re.Width - r, re.Y) GP.AddArc(re.X + re.Width - r, re.Y, r, r, 270, 90) GP.AddLine(re.X + re.Width, re.Y + r, re.X + re.Width, re.Y + re.Height - r) GP.AddLine(re.X + re.Width - r, re.Y + re.Height, re.X + r, re.Y + re.Height) GP.AddLine(re.X, re.Y + re.Height - r, re.X, re.Y + r) GP.AddArc(re.X, re.Y, r, r, 180, 90) GP.CloseFigure() Return GP End Function End Class End Class