Fehler bei UserControl - Panel wird beim verschieben verzerrt

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Breadsoft.

    Fehler bei UserControl - Panel wird beim verschieben verzerrt

    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

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. Public Class MetroSwitch
    4. Inherits System.Windows.Forms.UserControl
    5. Private Pos As Point
    6. Dim WithEvents schieber As New Panel
    7. Public Event CheckedChanged()
    8. Public Enum OnOff
    9. an
    10. aus
    11. End Enum
    12. Enum state
    13. hover
    14. click
    15. End Enum
    16. Dim _Currentstate As state
    17. <DefaultValue(OnOff.aus), _
    18. Description("Status des Controls, also An oder Aus.")> _
    19. Public Property Status() As OnOff
    20. Get
    21. Return CType(_Currentstate, OnOff)
    22. End Get
    23. Set(ByVal Value As OnOff)
    24. If _Currentstate <> Value Then
    25. _Currentstate = CType(Value, state)
    26. Me.Invalidate()
    27. End If
    28. End Set
    29. End Property
    30. Public Sub New()
    31. Me.Status = OnOff.aus
    32. Me.Size = New Size(130, 30)
    33. Me.DoubleBuffered = True
    34. With schieber
    35. .BackColor = Color.Red
    36. .Location = New Point(0, 0)
    37. .Size = New Size(Me.Size.Width - 80, Me.Size.Height)
    38. Me.Controls.Add(schieber)
    39. End With
    40. End Sub
    41. Protected Overrides Sub OnResize(ByVal e As EventArgs)
    42. Me.Size = New Size(130, 30)
    43. End Sub
    44. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    45. With e.Graphics
    46. .FillRectangle(Brushes.DarkGray, New Rectangle(0, 0, Me.Size.Width, Me.Size.Height))
    47. .DrawRectangle(Pens.Black, New Rectangle(0, 0, Me.Size.Width - 1, Me.Size.Height - 1))
    48. End With
    49. MyBase.OnPaint(e)
    50. End Sub
    51. Private Sub schieber_MouseDown(sender As Object, e As MouseEventArgs) Handles schieber.MouseDown
    52. If e.Button = Windows.Forms.MouseButtons.Left Then
    53. Pos = New Point(e.Location.X, e.Location.Y)
    54. End If
    55. End Sub
    56. Private Sub schieber_MouseMove(sender As Object, e As MouseEventArgs) Handles schieber.MouseMove
    57. If e.Button = Windows.Forms.MouseButtons.Left Then
    58. Dim loc As New Point(0, 0)
    59. ' Dim p As New Point(loc + (e.Location - Pos))
    60. Dim p As New Point(e.Location.X - Pos.X, e.Location.Y - Pos.Y)
    61. p.Y = 0
    62. 'Damit es nicht zu weit nach rechts/links verschoben werden kann
    63. If p.X < 0 Then
    64. p = New Point(0, schieber.Location.Y)
    65. ElseIf p.X >= 95 Then
    66. p = New Point(60, schieber.Location.Y)
    67. End If
    68. schieber.Location = p
    69. End If
    70. End Sub
    71. Private Sub schieber_MouseUp(sender As Object, e As MouseEventArgs) Handles schieber.MouseUp
    72. If e.Button = Windows.Forms.MouseButtons.Left Then
    73. If Status = OnOff.aus AndAlso schieber.Location.X > 0 Then
    74. schieber.Location = New Point(80, schieber.Location.Y)
    75. schieber.BackColor = Color.Green
    76. Status = OnOff.an
    77. ElseIf Status = OnOff.an AndAlso schieber.Location.X < 75 Then
    78. schieber.Location = New Point(0, schieber.Location.Y)
    79. schieber.BackColor = Color.Red
    80. Status = OnOff.aus
    81. End If
    82. End If
    83. End Sub
    84. 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.
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VincentTB“ () aus folgendem Grund: Option Strict On

    VincentTB schrieb:

    Ich hoffe, ihr könnt mir helfen, auch wenn ich kein Option Strict On verwende (noch nicht).
    Ja wann denn?
    Da häuft sich ja ein immer größerer Fehlerberg an.
    Und wenn dann noch C&P-Code mit Strict Off kommt, ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das einzige, was mir als Fehler angezeigt wird, ist die aus dem Internet kopierte Sub "abrunden", die ich wirklich nur ausprobiert habe, aber ich finde, dass sieht mit runden Ecken auch gar nicht gut aus. In meinem Projekt ist "abrunden" bereits draußen, werde den Code hier mal aktualisieren.
    Mfg
    Vincent

    Also ich würde da kein Panel nehmen. Ich hab auch letztens ein Schalter Control gemacht, bei dem beim draufklicken der Zustand sich ändert. Ich habe das mit e.Graphics.FillRectangle & e.Graphics.DrawRectangle und halt ein paar Berechnungen gemacht. Ist auch nicht schwer.

    EDIT: Hier auf der Website noch zwei Funktionen um runde Rechtecke zu zeichnen und zu füllen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Breadsoft“ ()