双缓冲技术(C# GDI)

c#如何实现防窗体闪烁的功能。大家都会想到运用双缓冲技术,那么在c#中是如何做的?

1、 利用默认双缓冲

(1)在应用程序中使用双缓冲的最简便的方法是使用 .NET Framework 为窗体和控件提供的默认双缓冲。通过将 DoubleBuffered 属性设置为 true。

       this.DoubleBuffered=true;

(2)使用 SetStyle 方法可以为 Windows 窗体和所创作的 Windows 控件启用默认双缓冲。

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

2、 手工设置双缓冲

.netframework提供了一个类BufferedGraphicsContext负责单独分配和管理图形缓冲区。每个应用程序域都有自己的默认 BufferedGraphicsContext 实例来管理此应用程序的所有默认双缓冲。大多数情况下,每个应用程序只有一个应用程序域,所以每个应用程序通常只有一个默认 BufferedGraphicsContext。默认 BufferedGraphicsContext 实例由 BufferedGraphicsManager 类管理。通过管理BufferedGraphicsContext实现双缓冲的步骤如下:

(1)获得对 BufferedGraphicsContext 类的实例的引用。

(2)通过调用 BufferedGraphicsContext.Allocate 方法创建 BufferedGraphics 类的实例。

(3)通过设置 BufferedGraphics.Graphics 属性将图形绘制到图形缓冲区。

(4)当完成所有图形缓冲区中的绘制操作时,可调用 BufferedGraphics.Render 方法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面。

(5)完成呈现图形之后,对 BufferedGraphics 实例调用释放系统资源的 Dispose 方法。

完整的例子,在一个400*400的矩形框内绘制10000个随机生成的小圆。

[c-sharp] view plain copy print ?
  1. BufferedGraphicsContext current = BufferedGraphicsManager.Current; //(1)   
  2.   
  3. BufferedGraphics bg;  
  4.   
  5. bg = current.Allocate(this.CreateGraphics(),this.DisplayRectangle); //(2)   
  6.   
  7. Graphics g = bg.Graphics;//(3)   
  8.   
  9. //随机 宽400 高400   
  10.   
  11.   
  12.   
  13. System.Random rnd = new Random();  
  14.   
  15. int x,y,w,h,r,i;  
  16.   
  17. for (i = 0; i < 10000; i++)  
  18.   
  19. {  
  20.   
  21.     x = rnd.Next(400);  
  22.   
  23.     y = rnd.Next(400);  
  24.   
  25.     r = rnd.Next(20);  
  26.   
  27.     w = rnd.Next(10);  
  28.   
  29.     h = rnd.Next(10);  
  30.   
  31.     g.DrawEllipse(Pens.Blue, x, y, w, h);  
  32.   
  33. }  
  34.   
  35. bg.Render();//(4)   
  36.   
  37. //bg.Render(this.CreateGraphics());   
  38.   
  39. bg.Dispose();//(5)  

3、   自己开辟一个缓冲区(如一个不显示的Bitmap对象),在其中绘制完成后,再一次性显示。

完整代码如下:

[c-sharp] view plain copy print ?
  1. Bitmap bt = new Bitmap(400, 400);  
  2.   
  3. Graphics bg = Graphics.FromImage(bt);  
  4.   
  5. System.Random rnd = new Random();  
  6.   
  7. int x, y, w, h, r, i;  
  8.   
  9. for (i = 0; i < 10000; i++)  
  10.   
  11. {  
  12.   
  13.     x = rnd.Next(400);  
  14.   
  15.     y = rnd.Next(400);  
  16.   
  17.     r = rnd.Next(20);  
  18.   
  19.     w = rnd.Next(10);  
  20.   
  21.     h = rnd.Next(10);  
  22.   
  23.     bg.DrawEllipse(Pens.Blue, x, y, w, h);  
  24.   
  25.   
  26.   
  27. }  
  28.   
  29. this.CreateGraphics().DrawImage(bt, new Point(0, 0));  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值