Pfad mit Farbverlauf

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Pfad mit Farbverlauf

    Heyho,

    Ich stehe gerade vor dem Problem dass ich in einem vorher definierten Path einen Farbverlauf "unterbringen" muss. Es handelt sich dabei um einen Kreis.

    Wie ist das möglich(will kein C&P sondern Ideen und Ansätze :))?

    Um Missverständnisse zu vermeiden: Ich habe zum Beispiel ein Rectangle das ich als Path benutzt habe und möchte nun entlang der Kanten einen farbverlauf zeichnen.

    8-) faxe1008 8-)
    PathGradientBrush?

    VB.NET-Quellcode

    1. ' Create a path that consists of a single ellipse.
    2. Dim path As New GraphicsPath()
    3. path.AddEllipse(0, 0, 140, 70)
    4. ' Use the path to construct a brush.
    5. Dim pthGrBrush As New PathGradientBrush(path)
    6. ' Set the color at the center of the path to blue.
    7. pthGrBrush.CenterColor = Color.FromArgb(255, 0, 0, 255)
    8. ' Set the color along the entire boundary
    9. ' of the path to aqua.
    10. Dim colors As Color() = {Color.FromArgb(255, 0, 255, 255)}
    11. pthGrBrush.SurroundColors = colors
    12. e.Graphics.FillEllipse(pthGrBrush, 0, 0, 140, 70)


    Edit:
    Wenn du nur die Kontur deiner Form zeichnen willst, dann benutze die Pen-Klasse
    Am Besten diesen Konstruktor: msdn.microsoft.com/de-de/library/y7858dt5.aspx (Brush,Größe des Pinsels)
    /nicht getestet

    rotherford schrieb:

    Wenn du nur die Kontur deiner Form zeichnen willst, dann benutze die Pen-Klasse
    Am Besten diesen Konstruktor: msdn.microsoft.com/de-de/library/y7858dt5.aspx (Brush,Größe des Pinsels)


    VB.NET-Quellcode

    1. Dim p as new pen(Brushes.green,5.0!)
    2. '..
    3. G.DrawRectangle(rect,p)

    Dazu: [VB 2008] [Tutorial] GDI+ Unter "Pen"
    /nicht getestet
    1.) ich kann schon relativ gut mit GDI umgehen.
    2.) du hast die einzelnen Paramter vertauscht
    3.) Das war nur ein Beispiel: es soll viel differnzierter sein. Also wirklich einen Farbverlauf der sich über die Kante fortsetzt.

    8-) faxe1008 8-)
    Meinst du sowas? (rotherford hat es ja eigentlich schon beschrieben)

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. Dim rect As New Rectangle(10, 20, 100, 50)
    3. Dim lgb As New LinearGradientBrush(New Point(0, 0), New Point(100, 100), Color.Red, Color.Blue)
    4. Dim p As New Pen(lgb, 10)
    5. e.Graphics.DrawRectangle(p, rect)
    6. End Sub

    Für etwas komplexeres einfach DrawRectangle durch zum Beispiel DrawPolygon ersetzen...

    Sieht dann so aus:
    Bilder
    • unbenannt.png

      4,53 kB, 183×120, 607 mal angesehen

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()

    Hi
    könnte man das nicht per InterpolationColors und ColorBlend lösen? Notfalls müsste man eben die Länge der Pfadpunkte und -formen ermitteln und entsprechend den Prozentwert ermitteln.
    Ansonsten kann man auch einfach einen GraphicsPath oder eine Region zeichnen und einen PathGradientBrush/LinearGradientBrush zur Darstellung verwenden oder in mehreren Schritten zeichnen.

    Gruß
    ~blaze~
    @vb-checker: Ja so in der Art hatte ich es mir vorgestellt. Danke deswegen :thumbup:
    @~blaze~: Danke auch für deine Hilfe, jedoch habe ich keinerlei Ahnung wie ich mit InterpolationColors und ColorBlend in VB umzugehen habe ?( ?(.

    8-) faxe1008 8-)
    Der Gradient-Brush läuft zwischen 2 Farben. Kann es sein, dass Dir eine umfangreichere Palette vorschwebt?
    Eine mögliche "handgemachte" Lösung:
    Du könntest Deine Palette auf einem Rechteck verteilen, Dein Bild rein schwarz-weiß auf ein anderes Rechteck verteilen und das Resultatbild als logische Verknupfunb beider Bilder generieren.
    In C++ ging so was, da sollte es das auch in .NET geben.
    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!
    @faxe1008
    Willst du denn nur einen Kreisring, oder den ganzen Kreis ?
    Ich glaube ich versteh das Problem nicht richtig, weil einen KreisPath mit einem Farbverlauf füllen ist ja wie jede andere Figur auch.

    Beispielcode

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    4. With e.Graphics
    5. .SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    6. End With
    7. Using g As New Drawing2D.GraphicsPath()
    8. g.AddPie(New Rectangle(0, 0, 100, 100), 0, 360)
    9. Using lgb As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(100, 100), Color.DodgerBlue, Color.LimeGreen)
    10. Using pn As New Pen(lgb, 10)
    11. e.Graphics.FillPath(lgb, g)
    12. End Using
    13. End Using
    14. End Using
    15. End Sub
    16. End Class

    (Ist das gut oder schlecht "Using" zu benutzen ?)
    Willst du dabei die Farbverteilung ändern, ändert du einfach die Spannweite deines Farbverlaufs. Dementsprechend wird auch nur ein Teil davon gezeichnet. Des Rest fällt sozusagen weg.
    Bilder
    • kreis.png

      4,05 kB, 282×261, 117 mal angesehen

    LaMiy schrieb:

    Ist das gut oder schlecht "Using" zu benutzen ?
    Es ist gut.
    Außerdem kannst Du in VB mehrere Usings in eine Zeile schreiben, auch wenn das hier etwas lang ist:
    Using

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. With e.Graphics
    3. .SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    4. End With
    5. Using g As New Drawing2D.GraphicsPath()
    6. g.AddPie(New Rectangle(0, 0, 100, 100), 0, 360)
    7. Using lgb As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(100, 100), Color.DodgerBlue, Color.LimeGreen), pn As New Pen(lgb, 10)
    8. e.Graphics.FillPath(lgb, g)
    9. End Using
    10. End Using
    11. End Sub
    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!

    LaMiy schrieb:

    (Ist das gut oder schlecht "Using" zu benutzen ?)

    Prinzipiell ist das immer gut, allerdings würde ich im Paint-Event nicht jedes mal so viele Objekte erstellen (zum Beispiel aus Zeitgründen). Also kann man die auch außerhalb des Paint-Events deklarieren. Dann muss man darauf achten, dass alle Objekte vor dem ersten Zeichnen auch gültige Werte haben. Beim Schließen der Form kann man die Objekte dann disposen.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Bei der ColorBlend gibt Colors an, welche Farbe an der in Positions angegeben Position (Prozentwert relativ zum Pfad) vorherrscht. Wenn du also die Länge des Pfadsegments hast, kannst du einfach den Prozentwert berechnen und die Farbe entsprechend setzen.
    Bei deinem obigen wären das aber vmtl. eh nur Viertel (also 0, 0.25f, 0.5f, 0.75f, 1.0f). Die Farben wären z.B. Color.Black, Color.DimGray, Color.Gray, Color.DimGray, Color.Black oder so, kp. Kannst ja manuell anpassen. Ein Farbverlauf muss nicht nur aus 2 Farben bestehen, das geht auch beim LinearGradientBrush so.

    Gruß
    ~blaze~