Laden...

DrawRectangle zeichnet kein Rectangle in Bitmap

Erstellt von jansenpeter vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.699 Views
J
jansenpeter Themenstarter:in
38 Beiträge seit 2013
vor 9 Jahren
DrawRectangle zeichnet kein Rectangle in Bitmap

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:

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:

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?

  • Zensiert -
C
2.121 Beiträge seit 2010
vor 9 Jahren

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?

J
jansenpeter Themenstarter:in
38 Beiträge seit 2013
vor 9 Jahren

sooooo habs jetzt so gelöst:

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);
            }
        }
  • Zensiert -
C
2.121 Beiträge seit 2010
vor 9 Jahren

Doppelter Code? Also wenn der jetzt wenigstens funtioniert könntest du das ja auch noch kürzen.

J
jansenpeter Themenstarter:in
38 Beiträge seit 2013
vor 9 Jahren

Kürzen hab ich noch vor, ich bin erstmal froh das ich mein Ziel erreicht hab 😉

  • Zensiert -