none
Wie füllt man ein Rechteck ohne Paint? RRS feed

  • Frage

  • Hi Leute,

    innerhalb einer Paintmethode kann ich ein Rectangle ohne größere Schwierigkeiten wie folgt füllen:

    protected override void OnPaint(PaintEventArgs e)
            {
    //Drawing an rectangle
                Graphics d = e.Graphics;
                Rectangle rect_ = new Rectangle(50, 30, 100, 100);
                LinearGradientBrush lBrush = new LinearGradientBrush(rect_, Color.Blue, Color.Yellow, LinearGradientMode.BackwardDiagonal);
                d.FillRectangle(lBrush, rect_);
    }

    Wie muss ich vorgehen,wenn ich-wie folgt-keine Paintmethode zur Verfügung habe und dennoch das Rechteck füllen will? 

    void AddRectangle(object sender, EventArgs e)
            {
                /*
                //Drawing an rectangle
                Graphics d = e.Graphics;
                Rectangle rect_ = new Rectangle(50, 30, 100, 100);
                LinearGradientBrush lBrush = new LinearGradientBrush(rect_, Color.Blue, Color.Yellow, LinearGradientMode.BackwardDiagonal);
                d.FillRectangle(lBrush, rect_);
                */
    
                // Erstellt ein Rechteck mit zufälligen Werten für Position, Breite/Höhe 
                // (mindestens 15 Pixel) und Farbe, das komplett zu sehen ist.
                int x = _random.Next(0, _canvas.Width);
                int y = _random.Next(0, _canvas.Height);
                int w = _random.Next(15, Math.Max(16, _canvas.Width - x));
                int h = _random.Next(15, Math.Max(16, _canvas.Height - x));
                Pen p = new Pen(Color.FromArgb(_random.Next(0, 256), _random.Next(0, 256), _random.Next(0, 256)), 1);
                Rectangle rect_ = new Rectangle(x, y, w, h);
                LinearGradientBrush lBrush = new LinearGradientBrush(rect_, Color.Blue, Color.Yellow, LinearGradientMode.BackwardDiagonal);            
                _graphicObjects.Add(new MyRectangle(p,rect_));
                this.Invalidate();
            }
    MyRectangle sieht wie folgt aus:
        public class MyRectangle : MyGraphicObject
        {
    
    
            public MyRectangle(Pen pen, Rectangle rect)
                : base(pen)
            {
                 Path.AddRectangle(rect);
            }
        }



    • Bearbeitet tklustig Mittwoch, 19. April 2017 17:00
    Mittwoch, 19. April 2017 16:58

Antworten

Alle Antworten

  • Hallo,

    wenn du weiterhin mit GDI+ arbeiten willst, musst du auch weiterhin alles in Paint machen. Dafür kannst du wie folgt vorgehen:

    1. Erstelle eine Liste aller zu zeichnenden Objekte in der Klasse.
    2. Zeichne alle Objekte der Liste im Paint-Event.
    3. Wenn du ein Objekt zur Liste hinzufügst, rufe Invalidate auf um den Zeichenvorgang neu zu starten.

    Wenn du außerhalb von Paint zeichnest, könnte es passieren, das bei verschieben des Fensters Teile fehlerhaft dargestellt werden. Von daher rate ich vom Verwenden von CreateGraphics etc. ab. Anders sieht es natürlich aus, wenn du auf eine Bitmap zeichnen solltest.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    • Als Antwort vorgeschlagen Thorsten Gudera Mittwoch, 19. April 2017 19:45
    • Als Antwort markiert tklustig Donnerstag, 27. April 2017 07:03
    Mittwoch, 19. April 2017 17:38
    Moderator
  • Hi,

    zusätzlich zu Tom's Ausführungen würde ich eine Draw oder Render Methode in den einzelnen Shapes (oder der Basisklasse) implementieren. Diese empfängt dann ein Graphics object und evtl weitere Daten, etwa die Größe und Position.

    Ein altes, doch IMHO gutes Beispiel:

    https://msdn.microsoft.com/en-us/library/ms973830.aspx

    Viele Grüße,

      Thorsten

    Mittwoch, 19. April 2017 19:48