Skąd PictureBox wie, że ma się odrysować?

0

W poniższym przykładzie nie ma instrukcji, która nakazywałaby odświeżenie pictureBox'a, a mimo to poprawnie się on odrysowuje. Jak to się dzieje?

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

namespace Test001
{
    public partial class Form2 : Form
    {
        Bitmap bitmap;

        BackgroundWorker backgroundWorker1 = new BackgroundWorker();

        public Form2()
        {
            InitializeComponent();

            bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);

            pictureBox1.Image = (Bitmap)bitmap.Clone();

            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(new PointF(pictureBox1.Width / 2, pictureBox1.Height / 2));
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            lock (bitmap)
            {
                pictureBox1.Image = (Bitmap)bitmap.Clone();
            }
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Graphics g;
            int seconds = 0;
            PointF middle = (PointF)e.Argument;
            lock (bitmap)
            {
                g = Graphics.FromImage(bitmap);
            }
            while (true)
            {
                Thread.Sleep(20);
                PointF end = new PointF(middle.X * (float)Math.Sin(Math.PI / 30.0 * seconds) + middle.X,
                                      middle.Y - middle.Y * (float)Math.Cos(Math.PI / 30.0 * seconds));
                lock (bitmap)
                {
                    g.Clear(Color.LightBlue);
                    g.DrawLine(Pens.Black, middle, end);
                }
                if (seconds < 60)
                {
                    seconds++;
                }
                else
                {
                    seconds = 0;
                }
            }
        }
    }
}
0

A to?

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            lock (bitmap)
            {
                pictureBox1.Image = (Bitmap)bitmap.Clone();
            }
        }

Masz tu przypisanie do właściwości Image. Cóż może innego robić, jak nie odrysowywać?

0

To prawda, ale wydawało mi się wcześniej, że w tej funkcji trzeba raportować zmianę w poniższy sposób. Raz zapomniałem tego zrobić, a mimo to wszystko się ładnie odrysowuje i zastanawiam się dlaczego?

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //...
            while (true)
            {
                Thread.Sleep(20);
                //...
                backgroundWorker1.ReportProgress(0);
            }
        }

        private void backgroundWorker1_ReportProgress(object sender, DoWorkEventArgs e)
        {
            pictureBox1.Invalidate();
        }

Skąd pictureBox wie, że ma skopiować bitmapę jeśli nie raportujemy tego w żaden sposób (przykład z pierwszego postu)?

0

system operacyjny wysyła wiadomość WM_PAINT, być może wysyła ją co jakiś czas nawet, jeśli nie ma potrzeby faktycznego odmalowania części okna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1