Farbverlauf bei Fenstermaximierung falsch

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Farbverlauf bei Fenstermaximierung falsch

    ausgelagert aus Button und Label mit einem Farbverlauf ~VaporiZed

    Darf ich dieses Thema nochmals aufgreifen. Ich nutze den Code oben vom ErfinderDesRades. Ich habe bei einer Form den BorderStyle auf None gesetzt und nutze stattdessen ein eigenes
    Panel. Darin ist dann der Farbverlauf. Klappt alles super, wenn ich die Form mittels Fenster Rand resize auch, aber nicht wenn ich die Maximiere, vorher normal, dann startet der Farbverlauf in der Mitte erneute, aber
    das sieht dann auch merkwürdig aus. Kann jemand dafür eine Lösung vorschlagen?

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

    Ich kann den Fehler nachvollziehen und habe eine funktionierende Möglichkeit gefunden.
    Das Problem tritt auch beim "geeigneten" Resizen auf, siehe Anhang.

    Das einfachste, wenn vielleicht auch nicht das sauberste (eine bessere fällt mir momentan nicht ein): Stoße beim Größenändern das komplette Neuzeichnen des Panels an:

    VB.NET-Quellcode

    1. Private Sub Panel1_SizeChanged(sender As Object, e As EventArgs) Handles Panel1.SizeChanged
    2. Panel1.Invalidate()
    3. End Sub

    Bilder
    • vorher.png

      437 Byte, 200×100, 113 mal angesehen
    • nachher.png

      15,38 kB, 753×461, 46 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Moin moin

    Ich habe mich auch mal darangemacht, weil ich etwas in dieser Richtung ggf auch bald brauche. :)

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Public Sub New()
    4. InitializeComponent()
    5. DrawGradient()
    6. End Sub
    7. Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
    8. DrawGradient()
    9. End Sub
    10. Private Sub DrawGradient()
    11. Dim startColor As Color = Color.DodgerBlue
    12. Dim endColor As Color = Color.LimeGreen
    13. Dim gradientRect As New Rectangle(0, 0, Panel1.Width, Panel1.Height)
    14. Using brush As New LinearGradientBrush(gradientRect, startColor, endColor, LinearGradientMode.Horizontal)
    15. Panel1.CreateGraphics().FillRectangle(brush, gradientRect)
    16. End Using
    17. End Sub
    18. Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
    19. DrawGradient()
    20. End Sub
    21. End Class
    Bilder
    • gradiend-1.jpg

      211,49 kB, 867×471, 40 mal angesehen
    • gradiend-2.jpg

      107,08 kB, 1.000×563, 46 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Nee, eben nicht. CreateGraphics ist nicht notwendig*, weil das e, was vom Paint-Event an den Paint-EventHandler weitergereicht wird, bereits ein Graphics-Objekt enthält, das man nutzen sollte. Dieses kannst Du an DrawGradient weiterreichen. Ja, das geht dann in Zeile#6 und Zeile#9 nicht. Aber in Zeile#6 wird es nicht benötigt und in Zeile#9 reicht das gezeigte Invalidate.

    * CreateGraphics selbst zu verwenden, sollte man m.E. vermeiden: Es sollte disposed werden (was Du nicht tust), es hat wohl noch andere Nachteile (nix genaues weiß ich nicht; ggf. Darstellungsfehler? Ressourcenintensiv in der Erstellung?)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    es hat wohl noch andere Nachteile
    Jou.
    Es ist nicht an den Update-Mechanismus des Systems gekoppelt, es weiß nicht, was alles upzudaten ist und was nicht, was Geschwindigkeitsnachteile bringt.
    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!
    Dann muss man aber was eigenes basteln.
    Bilder
    • ResizeRedraw.png

      17,48 kB, 849×186, 46 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Private Sub Panel1_SizeChanged(sender As Object, e As EventArgs) Handles Panel1.SizeChanged
    2. Panel1.Invalidate()
    3. End Sub



    Das funktioniert soweit schon, ich wüsste noch nicht so richtig was dagegen sprechen sollte.
    Der Code von Amelie nicht, ich werde das morgen aber nochmal testen. Es sah auf den ersten Blick komisch aus, aber vielleicht lag es auch an mir, denn ich habe es auf ein Panel gelegt.
    Update: habe es an einer neuen Form getestet, funktioniert auch super der Code von Amelie.
    Auf jeden Fall möchte ich mich bedanken für die Hilfe.

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

    @RISSN
    Moin moin

    Ich habe mein Versuch nochmals überarbeitet und er funktioniert.
    Das "Disposen" brauche ich hier nicht wegen des "Using" :?:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Private startColor As Color = Color.DodgerBlue
    4. Private endColor As Color = Color.LimeGreen
    5. Public Sub New()
    6. InitializeComponent()
    7. End Sub
    8. Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
    9. Dim g As Graphics = e.Graphics
    10. Dim gradientRect As New Rectangle(0, 0, Panel1.Width, Panel1.Height)
    11. Using brush As New LinearGradientBrush(gradientRect, startColor, endColor, LinearGradientMode.Horizontal)
    12. g.FillRectangle(brush, gradientRect)
    13. End Using
    14. End Sub
    15. Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged
    16. Panel1.Invalidate()
    17. End Sub
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. Me.Close()
    20. End Sub
    21. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    22. Me.WindowState = FormWindowState.Maximized
    23. End Sub
    24. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Den Using-Block hast Du in Post#5, für den Brush verwendet, aber nicht für das Graphics-Objekt, welches Du mit CreateGraphics inline in Zeile#16 erstellt hattest.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.