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;
}
}
}
}
}