从另一个线程在pictureBox上绘画

时间:2011-04-28 07:06:53

标签: c# multithreading system.drawing

我遇到了一些问题......代码如下:

delegate void SetCanvasDelegate(PictureBox canvas);
        public void SetCanvas(PictureBox canvas)
        {
            if (this.canvas.InvokeRequired)
                this.canvas.Invoke(new SetCanvasDelegate(SetCanvas), new object[] { canvas });
            else
                this.canvas = canvas;
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                PictureBox canvas = new PictureBox();
                Graphics g = Graphics.FromHwnd(canvas.Handle);

                RadarElement player = new RadarElement(new Point(150, 150), RadarElementType.Player);

                List<Enemy> enemies = new List<Enemy>();
                ores.Add(new Enemy(new Point(100, 100)));

                g.DrawLine(new Pen(Color.Black), new Point(0, 0), new Point(100, 100));

                if (trackEnemies.Checked)
                    foreach (Enemy e in enemies)
                        g.DrawImage(Image.FromFile("enemy.png"), e.Position);

                SetCanvas(canvas);

                Thread.Sleep(500);
            }
        }

this.canvas是我Form1中的PictureBox。

所有这些都在我的Form1类中...但是我的表单中的pictureBox没有更新为在代码中显示enemy.png。有什么问题,如何纠正呢?

2 个答案:

答案 0 :(得分:1)

你有Invalidate图片框吗?

答案 1 :(得分:1)

您似乎正在尝试将表单的PictureBox替换为在bw_DoWork方法中创建的PictureBox。这不会按照你期望的方式工作。您需要在图像对象上进行绘画,然后将绘制的图像粘贴到表单的图片框中。如果仍然没有显示,请使用Daren Thomas建议的Invalidate。

你可能需要按照

的方式做点什么
Bitmap canvas = new Bitmap(width, height);
using(Graphics g = Graphics.FromImage(canvas))
{
// paint here
}
SetCanvas(canvas);

然后相应地修改您的SetCanvas方法以接受图片而不是PictureBox