myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grafik und Sound » DrawRectangle zeichnet kein Rectangle in Bitmap
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

DrawRectangle zeichnet kein Rectangle in Bitmap

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
jansenpeter jansenpeter ist männlich
myCSharp.de-Mitglied

Dabei seit: 30.10.2013
Beiträge: 38


jansenpeter ist offline

DrawRectangle zeichnet kein Rectangle in Bitmap

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

ich hab einen Thread der mir auf eine Bitmap zufällig viele Rectangles zeichnen soll, aber es passiert nichts.

Hier mal der Code des Threads:

C#-Code:
private void calculate_effects()
        {
            while (effect_thread_active)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(delegate { perform_effect(ref rec_count); }));
                    this.Invoke(new MethodInvoker(delegate { this.Invalidate(); }));
                }
                else
                {
                    perform_effect(ref rec_count);
                }
                Thread.Sleep(100);
            }
        }

Und hier der Code der im Thread ausgeführt wird:

C#-Code:
private void perform_effect(ref int rec_count)
        {
            Bitmap new_bitmap = new Bitmap(225,225);
            img_point i_p = new img_point();
            int x = 0;
            int y = 0;
            foreach (Render_Effects_ render_effect in render_effects)
            {
                using (var graphics = Graphics.FromImage(new_bitmap))
                {
                    Rectangle rec_limit = new Rectangle(render_effect.location.X - 75, render_effect.location.Y - 75, 225, 225);

                    for (int i = 0; i < 100; i++)
                    {
                        Rectangle rec = new Rectangle(_rnd.Next(0, this.Width), _rnd.Next(0, this.Height), 20, 20);
                        if (rec.IntersectsWith(rec_limit))
                        {
                            graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), new Rectangle(rec_limit.X + 75, rec_limit.Y + 75, 20, 20));
                            MessageBox.Show(i.ToString());
                        }
                    }
                }
                new_bitmap.Save(Path.GetFullPath(Environment.CurrentDirectory) + @"\Properties\img.png");
            }
            Environment.Exit(0);
        }

Das gespeicherte Bild ist weiß bzw. leer. Ich weiß aber nicht warum, kann mir jemand helfen?
22.07.2014 22:20 Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.043


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hast du das debuggt und geschaut ob wirklich was gezeichnet wird? Stimmen die Werte, zeichnet es in den sichtbaren Bereich oder eventuell außerhalb? Du weißt dass du etwas anderes auf IntersectsWith prüfst als dann tatsächlich gezeichnet wird?

Dein Code macht übrigens nicht viel Sinn wenn du die ganze Arbeit zwar in einen Thread packst und sie dann aber mit Invoke wieder in den Hauptthread verlagerst.

Invalidate nur bei InvokeRequired?
23.07.2014 05:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
jansenpeter jansenpeter ist männlich
myCSharp.de-Mitglied

Dabei seit: 30.10.2013
Beiträge: 38

Themenstarter Thema begonnen von jansenpeter

jansenpeter ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

sooooo habs jetzt so gelöst:

C#-Code:
private void calculate_effects()
        {
            while (effect_thread_active)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(delegate
                    {
                        effects.Clear();
                        Bitmap new_bitmap = new Bitmap(225, 225);
                        img_point i_p = new img_point();
                        int x = 0;
                        int y = 0;
                        foreach (Render_Effects_ render_effect in render_effects)
                        {
                            using (var graphics = Graphics.FromImage(new_bitmap))
                            {
                                Rectangle rec_limit = new Rectangle(render_effect.location.X - 75, render_effect.location.Y - 75, 225, 225);

                                for (int i = 0; i < 10; i++)
                                {
                                    Rectangle rec = new Rectangle(_rnd.Next(0, 225), _rnd.Next(0, 225), 20, 20);
                                    graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rec);
                                }
                                x = render_effect.location.X - 75;
                                y = render_effect.location.Y - 75;
                            }
                            i_p.img = new_bitmap;
                            i_p.pnt = new Point(x, y);
                            effects.Add(i_p);
                        }
                    }));
                    this.Invoke(new MethodInvoker(delegate { this.Invalidate(); }));
                }
                else
                {
                    effects.Clear();
                    Bitmap new_bitmap = new Bitmap(225, 225);
                    img_point i_p = new img_point();
                    int x = 0;
                    int y = 0;
                    foreach (Render_Effects_ render_effect in render_effects)
                    {
                        using (var graphics = Graphics.FromImage(new_bitmap))
                        {
                            Rectangle rec_limit = new Rectangle(render_effect.location.X - 75, render_effect.location.Y - 75, 225, 225);

                            for (int i = 0; i < 10; i++)
                            {
                                Rectangle rec = new Rectangle(_rnd.Next(0, 225), _rnd.Next(0, 225), 20, 20);
                                graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rec);
                            }
                            x = render_effect.location.X - 75;
                            y = render_effect.location.Y - 75;
                        }
                        new_bitmap.Save(Path.GetFullPath(Environment.CurrentDirectory) + @"\Properties\img.png");
                        i_p.img = new_bitmap;
                        i_p.pnt = new Point(x, y);
                        effects.Add(i_p);
                    }
                    this.Invalidate();
                }
                Thread.Sleep(100);
            }
        }
23.07.2014 21:19 Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.043


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Doppelter Code? Also wenn der jetzt wenigstens funtioniert könntest du das ja auch noch kürzen.
24.07.2014 06:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
jansenpeter jansenpeter ist männlich
myCSharp.de-Mitglied

Dabei seit: 30.10.2013
Beiträge: 38

Themenstarter Thema begonnen von jansenpeter

jansenpeter ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Kürzen hab ich noch vor, ich bin erstmal froh das ich mein Ziel erreicht hab ;)
24.07.2014 07:17 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 6 Jahre.
Der letzte Beitrag ist älter als 6 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 29.09.2020 03:15