Hallo,
ich bastel gerade an einem kleinen Control, welches als AnAus Switch dienen soll. Es klappt bis jetzt auch alles prima, nur wird der Schieber(ein Panel) extrem verzerrt, wenn man ihn verschiebt:
Hier wäre der Code (es sind viele Sachen drin, die noch geändert werden müssen bzw. noch nicht fertig sind)
Spoiler anzeigen
Ich hoffe, ihr könnt mir helfen. Es geht erstmal darum, woran es liegt, dass das Panel so verzerrt wird.
Oder, was natürlich noch besser wäre, wie kann ich das ohne Panel machen bzw. geht das auch mit GDI?
Freue mich auf eure Antworten.
ich bastel gerade an einem kleinen Control, welches als AnAus Switch dienen soll. Es klappt bis jetzt auch alles prima, nur wird der Schieber(ein Panel) extrem verzerrt, wenn man ihn verschiebt:
Hier wäre der Code (es sind viele Sachen drin, die noch geändert werden müssen bzw. noch nicht fertig sind)
VB.NET-Quellcode
- Option Strict On
- Imports System.ComponentModel
- Public Class MetroSwitch
- Inherits System.Windows.Forms.UserControl
- Private Pos As Point
- Dim WithEvents schieber As New Panel
- Public Event CheckedChanged()
- Public Enum OnOff
- an
- aus
- End Enum
- Enum state
- hover
- click
- End Enum
- Dim _Currentstate As state
- <DefaultValue(OnOff.aus), _
- Description("Status des Controls, also An oder Aus.")> _
- Public Property Status() As OnOff
- Get
- Return CType(_Currentstate, OnOff)
- End Get
- Set(ByVal Value As OnOff)
- If _Currentstate <> Value Then
- _Currentstate = CType(Value, state)
- Me.Invalidate()
- End If
- End Set
- End Property
- Public Sub New()
- Me.Status = OnOff.aus
- Me.Size = New Size(130, 30)
- Me.DoubleBuffered = True
- With schieber
- .BackColor = Color.Red
- .Location = New Point(0, 0)
- .Size = New Size(Me.Size.Width - 80, Me.Size.Height)
- Me.Controls.Add(schieber)
- End With
- End Sub
- Protected Overrides Sub OnResize(ByVal e As EventArgs)
- Me.Size = New Size(130, 30)
- End Sub
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- With e.Graphics
- .FillRectangle(Brushes.DarkGray, New Rectangle(0, 0, Me.Size.Width, Me.Size.Height))
- .DrawRectangle(Pens.Black, New Rectangle(0, 0, Me.Size.Width - 1, Me.Size.Height - 1))
- End With
- MyBase.OnPaint(e)
- End Sub
- Private Sub schieber_MouseDown(sender As Object, e As MouseEventArgs) Handles schieber.MouseDown
- If e.Button = Windows.Forms.MouseButtons.Left Then
- Pos = New Point(e.Location.X, e.Location.Y)
- End If
- End Sub
- Private Sub schieber_MouseMove(sender As Object, e As MouseEventArgs) Handles schieber.MouseMove
- If e.Button = Windows.Forms.MouseButtons.Left Then
- Dim loc As New Point(0, 0)
- ' Dim p As New Point(loc + (e.Location - Pos))
- Dim p As New Point(e.Location.X - Pos.X, e.Location.Y - Pos.Y)
- p.Y = 0
- 'Damit es nicht zu weit nach rechts/links verschoben werden kann
- If p.X < 0 Then
- p = New Point(0, schieber.Location.Y)
- ElseIf p.X >= 95 Then
- p = New Point(60, schieber.Location.Y)
- End If
- schieber.Location = p
- End If
- End Sub
- Private Sub schieber_MouseUp(sender As Object, e As MouseEventArgs) Handles schieber.MouseUp
- If e.Button = Windows.Forms.MouseButtons.Left Then
- If Status = OnOff.aus AndAlso schieber.Location.X > 0 Then
- schieber.Location = New Point(80, schieber.Location.Y)
- schieber.BackColor = Color.Green
- Status = OnOff.an
- ElseIf Status = OnOff.an AndAlso schieber.Location.X < 75 Then
- schieber.Location = New Point(0, schieber.Location.Y)
- schieber.BackColor = Color.Red
- Status = OnOff.aus
- End If
- End If
- End Sub
- End Class
Ich hoffe, ihr könnt mir helfen. Es geht erstmal darum, woran es liegt, dass das Panel so verzerrt wird.
Oder, was natürlich noch besser wäre, wie kann ich das ohne Panel machen bzw. geht das auch mit GDI?
Freue mich auf eure Antworten.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VincentTB“ () aus folgendem Grund: Option Strict On