1

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

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

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

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

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 = 
4

1 回答 1

0

跟踪所有形状位置(我假设您已经是)并使用图片框的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();
    }

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

您也不需要每次都绘制图片框的图像,只需在表单加载事件中设置一次即可。

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

APictureBox按照标准是双缓冲的,所以你不应该闪烁。

于 2013-01-15T18:48:51.243 回答