'V1.3 Imports System.Drawing.Drawing2D Public Class Toggler 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 #Region "Eigenschaften" 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 Private _Schriftart As Font = New Font("Microsoft Sans Serif", 12, FontStyle.Bold) 'Neu in V1.2 Public Property Schriftart As System.Drawing.Font Get Return _Schriftart End Get Set(value As System.Drawing.Font) _Schriftart = value Invalidate() End Set End Property Private _TextColorON As Color = Color.White 'Neu in V1.2 Public Property TextColorON As Color Get Return _TextColorON End Get Set(value As Color) _TextColorON = value Invalidate() End Set End Property Private _TextColorOFF As Color = Color.White 'Neu in V1.2 Public Property TextColorOFF As Color Get Return _TextColorOFF End Get Set(value As Color) _TextColorOFF = value Invalidate() End Set End Property Private _ToggleImageOFF As Bitmap 'Neu in V1.2 Public Property ToggleImageON As Bitmap Get Return _ToggleImageOFF End Get Set(value As Bitmap) _ToggleImageOFF = value Invalidate() End Set End Property Private _ToggleImageON As Bitmap 'Neu in V1.2 Public Property ToggleImage As Bitmap Get Return _ToggleImageON End Get Set(value As Bitmap) _ToggleImageON = value Invalidate() End Set End Property Private _AbgerundetePixel As Integer = 1 'Neu in V1.2 Public Property AbgerundetePixel As Integer Get Return _AbgerundetePixel End Get Set(value As Integer) _AbgerundetePixel = value Invalidate() End Set End Property Private _ToggleBorder As Boolean = False 'Neu in V1.2 Public Property ToggleBorder As Boolean Get Return _ToggleBorder End Get Set(value As Boolean) _ToggleBorder = value Invalidate() End Set End Property Private _Border As Boolean = False 'NEU in V1.2 Public Property Border As Boolean Get Return _Border End Get Set(value As Boolean) _Border = value Invalidate() End Set End Property Private _ToggleBorderColor As Color = Color.Black 'Neu in V1.2 Public Property ToggleBorderColor As Color Get Return _ToggleBorderColor End Get Set(value As Color) _ToggleBorderColor = value Invalidate() End Set End Property Private _BorderColor As Color 'NEU in V1.2 Public Property BorderColor As Color Get Return _BorderColor End Get Set(value As Color) _BorderColor = value Invalidate() End Set End Property Private _ToggleColorON As Color = Color.FromArgb(7, 129, 170) Public Property ToggleColorON As Color Get Return _ToggleColorON End Get Set(value As Color) _ToggleColorON = value Invalidate() End Set End Property Private _ToggleColorOFF As Color = Color.FromArgb(84, 85, 86) Public Property ToggleColorOFF As Color Get Return _ToggleColorOFF End Get Set(value As Color) _ToggleColorOFF = value Invalidate() End Set End Property Private _TextON As String = "ON" Public Property TextON As String Get Return _TextON End Get Set(value As String) _TextON = value Invalidate() End Set End Property Private _TextOFF As String = "OFF" Public Property TextOFF As String Get Return _TextOFF End Get Set(value As String) _TextOFF = value Invalidate() End Set End Property #End Region 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 If _Border = True Then Dim Border = New Rectangle(0, 0, Width - 1, Height - 1) e.Graphics.DrawRectangle(New Pen(_BorderColor), Border) End If T.DrawThumb(e.Graphics, Check, _AbgerundetePixel, _ToggleColorON, _ToggleColorOFF, _TextON, _TextOFF, _TextColorON, _TextColorOFF, _Schriftart, _ToggleBorderColor, _ToggleBorder, _ToggleImageON, _ToggleImageOFF) 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.MouseClick If e.Button = Windows.Forms.MouseButtons.Left Then Checked = Not Checked 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} 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, _AbgerundetePixel As Integer, _ColorON As Color, _ColorOFF As Color, _TextON As String, _TextOFF As String, _textColorON As Color, __textColorOFF As Color, _Schriftart As Font, _ToggleBorderColor As Color, _ToggleBorder As Boolean, imageON As Bitmap, imageOFF As Bitmap) Using GP As GraphicsPath = New GraphicsPath If _AbgerundetePixel = 0 Then _AbgerundetePixel = 1 MessageBox.Show("Abgerundete Pixel darf nicht kleiner als 1 sein!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End If GetRoundedPath(Rect, _AbgerundetePixel, GP) g.SmoothingMode = SmoothingMode.HighQuality g.TextContrast = 0 '0 bis 12 g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias g.CompositingQuality = CompositingQuality.GammaCorrected Using SB As New SolidBrush(Color.FromArgb(25, 255, 255, 255)) Using p As New Pen(SB, 1) If drawChecked Then If imageON Is Nothing Then g.FillPath(New SolidBrush(_ColorON), GP) 'Schieber füllen g.DrawString(_TextON, _Schriftart, New SolidBrush(_textColorON), Rect, Textformat) 'Text zeichnen Else g.DrawImage(imageON, Rect) End If Else If imageOFF Is Nothing Then g.FillPath(New SolidBrush(_ColorOFF), GP) 'Schieber füllen g.DrawString(_TextOFF, _Schriftart, New SolidBrush(__textColorOFF), Rect, Textformat) 'Text zeichnen Else g.DrawImage(imageOFF, Rect) End If End If If _ToggleBorder = True Then g.DrawRectangle(New Pen(_ToggleBorderColor), Rect) Else g.DrawLine(p, Rect.X + 2, 2, Rect.X + Rect.Width - 2, 2) 'Linie über Schieber zeichnen End If 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.AddArc(re.X + re.Width - r, re.Y + re.Height - r, r, r, 0, 90) GP.AddLine(re.X + re.Width - r, re.Y + re.Height, re.X + r, re.Y + re.Height) GP.AddArc(re.X, re.Y + re.Height - r, r, r, 90, 90) 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