我在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 =
答案 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,因此您不应该闪烁。