基于c#的双缓冲技术画图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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);
    }
}

以上是关于基于c#的双缓冲技术画图的主要内容,如果未能解决你的问题,请参考以下文章

LVS

基于LVS负载均衡群集来实现Keepalived的部署 技术

Keepalived+LVS实战案例: 单主架构实现WEB负载均衡及可用

LVS负载均衡三种模式的实现

LVS

使用LVS实现web服务的负载均衡