GDI+ Panel, UpwardDiagonal

  • Allgemein

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Gather.

    GDI+ Panel, UpwardDiagonal

    Hallo liebe Community,
    ich arbeite mich gerade in GDI+ und in will nun ein einfaches Panel-Control erstellen,
    beidem der Hitnergrund aus Diagonalen besteht (steam-Style)

    Ich weiß das es mit diesem Code geht:

    VB.NET-Quellcode

    1. Dim H As New HatchBrush(HatchStyle.DarkUpwardDiagonal, Color.FromArgb(15, Color.Black), Color.Transparent)


    Jedoch weiß ich nicht wie genau ich den Code mit anderen zusammen füge bzw. anpasse sodass dies über das Ganze Panel geht.
    UND ich würde ebenfalls gerne wissen in welches Event der Code dann gehört.

    Ich bitte euch, mir den Code zu Erklären, bzw. wenn Ihr keinen Code gebt bitte eine gute Erklärung dazu.
    Damit ich mich weiterbilden kann.

    Bitte um Hilfe,
    Danke im Vorraus!
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    schau mal in mein GDI+ Tutorial rein - siehe Signatur^^

    Der Zeichnen-Code gehört ins Paint-Event des Controls. Dort zeichnest du anhand der Eigenschaften die das Control aufweist. BSP: Button.Text gibt auskunft darüber welcher String auf dem Button landet - so ist das Grundprinzip.

    Ein Brush verhälts sich wie ein Pinsel - d.h. man füllt bereiche damit aus. Schau dir die Methoden an, die IntelliSense dir im Paint-Event auflistet, wenn du "e.graphics.fi..." tippst. Da der Panel ein Rechteck ist eignet sich hier die Methode .FillRectangle am besten.

    lg
    Danke erstmal,
    jetzt habe ich schon sowas hinbekommen:

    VB.NET-Quellcode

    1. Private Sub Panel_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. Dim tmpBrush As New Drawing2D.HatchBrush(Drawing2D.HatchStyle.BackwardDiagonal, Color.FromArgb(15, Color.Black), Color.FromArgb(56, 54, 53))
    3. With e.Graphics
    4. .FillRectangle(tmpBrush, 0, 0, Me.Width, Me.Height)
    5. End With
    6. End Sub

    Jetzt möchte ich aber das sich das Ganze mit dem Größe verändern des Panels mit verkleiner.
    Sprich dass diese Spalten nicht so groß bleiben, sondern sich wie ein Bild auf Strech mit verkleinern, bzw. vergrößern.

    Wie stelle ich das an?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Vielleicht wisst ihr dann noch nen anderen weg?

    Zur besseren verständniss ich will ein Panel erstellen, das ca. so aussieht.

    THEORETISCH wie wenn man das Bild als BackGroundImage nimmt und das Layout auf Tile stellt.
    Jedoch will ich das ganze mit GDI+ machen.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Das ist schon etwas komplexer. Mein Ansatz wäre es das komplette Muster aus als eine Art Fliesenboden zu sehen - du musst also einmalig eine Fliese zeichnen und kannst diese vervielfältigen. Hierfür eignet sich der Texturebrush wunderbar.


    So könnte eine Fliese aussehen - der Block ist 50x50 Pixel groß. Soll das Raster enger werden, dann muss dieser Block ebenfalls verkleinert gezeichnet werden - z.b. 5x5 Pixel. Das Funktioniert ganz einfach, stichwort .drawline. Am besten in eine Methode auslagern, die, wenn sich das Rastermaß verändert, eine neue Block-Grafik erstellt.

    Die komplette Form wird dann mittel Texturebursh mit der Block-Textur gefüllt. Aufpassen muss man mit Antialiasing etc, da dies zu ungewünschten effekten führen kann.

    Alternativ könnte man auch jede Linie einzeln Zeichnen lassen, lässt sich per Schleife auch problemlso machen, mein weg ist allerdings der Performanteste. Was sich besser eignet muss der Programmierer entscheiden.

    lg
    Danke für deine schöne erklärung doch für mich als anfänger ist das etwas Kompliziert.
    Ich habe im Internet diesen Code gefunden:

    VB.NET-Quellcode

    1. Dim x2 As Rectangle = New Rectangle(e.Bounds.Location, New Size(e.Bounds.Width - 1, e.Bounds.Height))
    2. Dim x3 As Rectangle = New Rectangle(x2.Location, New Size(x2.Width, (x2.Height / 2) - 1))
    3. Dim G1 As New LinearGradientBrush(New Point(x2.X, x2.Y), New Point(x2.X, x2.Y + x2.Height), Color.FromArgb(60, 60, 60), Color.FromArgb(50, 50, 50))
    4. Dim H As New HatchBrush(HatchStyle.DarkDownwardDiagonal, Color.FromArgb(15, Color.Black), Color.Transparent)
    5. e.Graphics.FillRectangle(G1, x2) : G1.Dispose()
    6. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(25, Color.White)), x3)
    7. e.Graphics.FillRectangle(H, x2) : G1.Dispose()


    Hier wird eine Combobox (das Rechtseck) ausgefüllt, mit DarkDownwardDiagonal.
    Grundsätzlich genau das was ich suche (nur hald Upward aber das kann man ja ändern).
    Das Problem ist jedoch, ich weiß nicht genau wie ich dieses Snippet auf mein Panel anwenden kann.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Könnte mir bitte wer helfen?
    Ich weiß nicht weiter...
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!