Laden...

Ein beliebiges Objekt "voll" malen

Erstellt von axelfxxx vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.711 Views
axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 9 Jahren
Ein beliebiges Objekt "voll" malen

Hallo ich möchte einfach ein beliebiges Objekt (PictureBox oder Panel) mit Objekten voll zeichnen.

Wie ich Objekte zeichne weis ich, aber wie bekomme ich es hin, das das Objekt bestehen bleibt ?

Ich habe eine Form und auf dieser Form lasse ich innerhalb von Millisekunden durch Zufallsprinzip Objekte in eine PictureBox zeichnen (Kreise, Linien), aber diese bleiben nicht bestehen, sondern werden immer wieder neu gezeichnet , bis irgendwann sich die Anwendung aufhängt und dann ein rotes Kreuz zeichnet. Wo wir dann zu meiner Nächsten Frage kommen: Warum bekomme ich ein rotes Kreuz ?

Danke im Voraus


private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            
            Random rnd = new Random();

            int x = rnd.Next(640);
            int y = rnd.Next(480);

            Point pt = new Point(x, y);

            Pen p = new Pen(Color.FromArgb(rnd.Next(128),rnd.Next(128), rnd.Next(128)),100);

            e.Graphics.DrawArc(p, new Rectangle(x, y, x, y), x,y);
                        
            Timer tim = new Timer();
            tim.Enabled = true;
            tim.Interval = 100;
            tim.Tick += tim_Tick;          

        }

        private void tim_Tick(object sender, EventArgs e)
        {
            //Objekte säubern
            this.Invalidate();
            pictureBox1.Invalidate();
        }

---- >
Keine Signatur 😉

5.658 Beiträge seit 2006
vor 9 Jahren

Hi axelfxxx,

wie bekomme ich es hin, das das Objekt bestehen bleibt ?

Du mußt immer alles zeichnen. Beim Aufruf der Invalidate-Funktion wird der gesamte Bereich verworfen.

Warum bekomme ich ein rotes Kreuz ?

Sicherlich weil du so verschwenderisch mit den Resourcen umgehst. Du erstellst bei jedem Aufruf der Zeichenfunktion eine neues Pen-Objekt, und gibst die unverwalteten Resourcen nicht mehr frei. Das steht aber auch so in [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox). Außerdem erstellst du jedesmal einen neuen Timer, was unnötig ist.

Christian

Weeks of programming can save you hours of planning

P
1.090 Beiträge seit 2011
vor 9 Jahren

Das mit dem Timer ist wirklich keine gute Idee, da du nach den durchlauf der Methode keine Referenz mehr auf ihn hast, kannst du ihn nicht Stoppen und auch kein Dispose aufrufen. Da beim setzen von Timer.Enabled = true GCHandle.Alloc aufgerufen wir (war auf jeden Fall mal so). Kann der GC ihn auch nicht Collecten. Du hast da also ein Speicher Leak.

Das sollte auch das Geheimnis des Threads „Timer und Dispose“ lösen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern