使用GDI +绘制多个移动对象

时间:2013-01-15 18:33:24

标签: c# winforms gdi+

我在PictureBox图片画布上绘制了一些形状,但是我遇到了一个问题,我需要在画布上同时为它们设置动画。

因为我需要更新画布上形状的位置,这意味着我需要清除画布并重绘所有内容,这显然会对更新产生闪烁效果。

我有什么选择来解决这个问题?我发现移动它们的唯一方法是使形状“跟踪”,这不是我想要的。

这里有一些代码可以解释我的困境:

Form_Load:
      OriginalImage = pictureBox1.Image;

Timer_Tick:
    pictureBox1.Image = OriginalImage;
    Image canvas = (Image)pictureBox1.Image.Clone();
    Graphics g = Graphics.FromImage(canvas);
    g.DrawRectangle(newPosition);

Timer2_Tick:
    // This will clear the canvas and only draw the ellipse, which means I can't get both shapes on at the same time.
    pictureBox1.Image = OriginalImage;
    Image canvas = (Image)pictureBox1.Image.Clone();
    Graphics g = Graphics.FromImage(canvas);
    g.FillEllipse(newPosition);
    pictureBox1.Image = 

1 个答案:

答案 0 :(得分:0)

跟踪所有形状位置(我假设您已经存在)并使用pictureBox的Paint事件。

然后做这样的事情:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(your_rectangle);
        e.Graphics.DrawEllipse(your_ellipse);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        pictureBox1.Invalidate();
    }

每次重新绘制pictureBox时,它会将矩形和椭圆绘制在相关位置。要使pictureBox更新(重绘),您可以在计时器中使用.Invalidate()方法,这样每次计时器触发时都会更新您的pictureBox。将计时器间隔设置为您希望图像更新的频率。

每次都不需要绘制pictureBox的图像,只需在表单Load事件中设置一次。

    private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox1.Image = myImage;
    }

根据标准,PictureBox是DoubleBuffered,因此您不应该闪烁。