博客园  :: 首页  :: 管理

解决GDI+制作动画中出现闪烁问题

Posted on 2005-11-17 16:06  Paker Liu  阅读(1145)  评论(0编辑  收藏  举报
GDI+作为微软公司.NET平台下的一种新的图形技术,其良好的抽象封装的特点带给了开发人员对于图形元素开发的方便。但是有一个问题一直是很多开发人员对于GDI+不太满意的地方,对于绘画动画时候出现的闪烁问题。

例:GDI+绘画一个运动的圆

(1) 一般方法
首先建立一个名为pictureBox1的PictureBox作为画布;
然后建立一个名位timer1的Timer去实现动画的过程。
private void timer1_Tick(object sender, System.EventArgs e)
{
//这里i和j作为全局变量
if( i < this.Width && j < this.Height)
{
Graphics g = this.pictureBox1.CreateGraphics();
g.Clear(Color.White);
g.FillEllipse(Brushes.Blue,i,j,50,50);
i++;
j++;
g.Dispose();
}
else
{
this.timer1.Enabled = false;
}
}
最后可以得到一个运动的圆,但是运动过程出现闪烁;


这里可以通过一个缓冲方式去解决这个闪烁问题的.'

(2) 缓冲方法
首先建立一个名为pictureBox1的PictureBox作为画布;
然后建立一个需要运动的图形元素move(Bitmap),设置全局变量,在timer前完成;
move = new Bitmap(50,50);
Graphics g = Graphics.FromImage(move);
g.FillEllipse(Brushes.Blue,0,0,50,50);
g.Dispose();
再建立一个名位timer1的Timer去实现动画的过程。
if( i < this.Width && j < this.Height)
{
bitmap = new Bitmap(this.Width,this.Height);
Graphics g = Graphics.FromImage(bitmap);
for(int m = 0 ; m < 50 ; m++)
{
for(int n = 0 ; n < 50 ;n++)
{
bitmap.SetPixel((m+i),(n+i),(move.GetPixel(m,n)));
}
}
this.pictureBox1.Image = bitmap ;
i++;
j++;
g.Dispose();
}
else
{
this.timer1.Enabled = false;
}

这样得到了一个没有闪烁的运动的圆.