(GDI+) Rahmen von Panel wird bei Veränderung der Fenstergröße mehrfach gezeichnet

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Angry Onion.

    (GDI+) Rahmen von Panel wird bei Veränderung der Fenstergröße mehrfach gezeichnet

    Hallo,

    wenn ich die Größe meine Form durch ziehen verändere, dann wir die Linie in meinem Panel ganz häufig gezeichnet. Sie soll eigentlich nur einen Rahmen darstellen.
    Was macht man dagegen?

    Setz mal alle Standardflags. Ansonsten mal Graphics.Clear bemühen, normalerweise macht das System dass aber selbst. Falls es so klappt würde ich dann im WM_ERASEBKGND TRUE returnen, sonst ists doppelt. Versuch vorher aber mal die Flag zu setzen und nicht nur die Property, ggf. macht das einen Unterschied.
    Laut deiner Beschreibung handelt es sich um ein Panel, in der Form bringt das also nix. Ich meinte das hier in den Konstruktor deines Controls:

    VB.NET-Quellcode

    1. SetStyle(ControlStyles.ResizeRedraw, True)
    2. UpdateStyles()
    Bei Bedarf auch noch die Flags AllPaintingInWmPaint, OptimizedDoubleBuffered und UserPaint setzen.
    okay, dann versuch ich mich mal daran.

    Danke für die Antworten

    Genügt das:

    VB.NET-Quellcode

    1. Public Class TitleBarPanel : Inherits Panel
    2. Public Sub New()
    3. SetStyle(ControlStyles.ResizeRedraw, True)
    4. UpdateStyles()
    5. End Sub
    6. End Class


    Oder muss ich den alten Konstruktor irgendwie überschreiben?

    Edit: Hab's Control verändern, einige Fragen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Angry Onion“ ()

    So also ich habe jetzt eine neue Klasse, die von der Klasse Panel erbt.

    Das Ergebnis ist, dass es bei schnellem Verändern der Größe weiterhin "Schlieren" hinter sich her zieht.

    VB.NET-Quellcode

    1. Public Class TitleBarPanel : Inherits Panel
    2. Public Sub New()
    3. SetStyle(ControlStyles.ResizeRedraw, True)
    4. SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    5. SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    6. SetStyle(ControlStyles.UserPaint, True)
    7. UpdateStyles()
    8. End Sub
    9. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    10. MyBase.OnPaint(e)
    11. Dim points As Point() = {New Point(0, Me.Height), _
    12. New Point(0, 0), _
    13. New Point(Me.Width - 1, 0), _
    14. New Point(Me.Width - 1, Me.Height)}
    15. Dim pen As New Pen(Color.FromArgb(100, 100, 100))
    16. With e.Graphics
    17. .DrawLines(pen, points)
    18. End With
    19. End Sub
    20. End Class


    Woran kann das liegen?

    Edit: In einer normalen Windows Form funktioniert die Klasse 1A. Muss irgendwie an meiner eigenen Form liegen.

    Danke für die Hilfe, wieder eine Grundlage mehr dazu gelernt.

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

    Probiers mal so:

    VB.NET-Quellcode

    1. Class BorderPanel : Inherits Panel
    2. Public Sub New()
    3. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.ResizeRedraw, True)
    4. End Sub
    5. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    6. MyBase.OnPaint(e)
    7. ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, Color.FromArgb(100, 100, 100), ButtonBorderStyle.Solid)
    8. End Sub
    9. Protected Overrides Sub OnResize(e As EventArgs)
    10. MyBase.OnResize(e)
    11. Me.Invalidate()
    12. End Sub
    13. End Class