基于c#的双缓存技术绘图

导致画面闪烁的关键原因是:。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。

因此,,当图数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。

解决上述问题的关键在于:窗口刷新一次的过程中,让所有图元同时显示到窗口。所以就要用到双缓冲技术。所谓双缓冲技术就是将要绘制的图元现在内存中绘制完毕,然后将绘制好的图元绘制的窗体,实现所有图元同时显示到窗口,消除闪烁。

双缓冲技术c#实现如下:

1.设置绘制风格:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.ResizeRedraw|ControlStyles.AllPaintingInWmPaint,true); 

2.在内存中绘制图元:

Bitmap bmp=null;
Graphics g_bmp=null;
bmp=new Bitmap(this.Width,this.Height);
g_bmp=Graphics.FromImage(bmp);
g_bmp.Clear(this.BackColor);
g_bmp.DrawString("重绘",this.Font,new SolidBrush(this.ForeColor),this.Location.X+1,this.Location.Y+1);
this.Refresh();

3.实现在窗体的绘制:

private void this_Paint(object sender,PaintEventArgs e)
{
    Graphics g=e.Graphics;
    if(g==null) return;
    if(g_bmp!=null)
    {
        g.DrawImage((Image)bmp,0,0);
    }
}

转载自:http://www.cnblogs.com/zhaoshaoxiong/p/5157394.html

lonefox转载评论:关键点是这一行代码this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.ResizeRedraw|ControlStyles.AllPaintingInWmPaint,true); 

没有这一行代码,再牛逼的双缓存也可能会闪烁。

你可能感兴趣的:(C#杂记)