Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Ein beliebiges Objekt "voll" malen
axelfxxx
myCSharp.de - Member

Avatar #avatar-2105.gif


Dabei seit:
Beiträge: 144
Herkunft: Berlin, Deutschland

Themenstarter:

Ein beliebiges Objekt "voll" malen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5966
Herkunft: Leipzig

beantworten | zitieren | melden

Hi axelfxxx,
Zitat von 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.
Zitat von axelfxxx
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
private Nachricht | Beiträge des Benutzers
Palin
myCSharp.de - Member



Dabei seit:
Beiträge: 1115

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers