C#自定义控件-消除闪烁

C#自定义控件-消除闪烁

 

开始学习制作自定义控件的时候,自定义控件在重绘时总是发生闪烁。这是因为直接向屏幕绘图导致的。自己绘制控件的外观首先要重载OnPaint事件处理函数,该函数的一个简单示例如下:

  1. protected override void OnPaint(PaintEventArgs pe)   
  2. {   
  3.     pe.Graphics.DrawImage(...);   
  4. }  

这里是直接向OnPaint的参数pe所带的Graphics绘图表面进行绘制的,而这也正是导致闪烁的原因。消除闪烁有两个方法。
一个打开双缓冲。这个功能是Control类提供的,自定义控件都是直接或间接继承Control类,所以直接使用此功能是很方便的。在自定义控件的构造函数内增加下列代码即可。

  1. this.SetStyle(ControlStyles.UserPaint, true);   
  2. this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);   
  3. this.SetStyle(ControlStyles.DoubleBuffer, true);  

这个方法虽然方便,但是不能使我们明白其工作原理。
另一个方法就是自己实现双缓冲。
首先定义一个私有变量Bitmap _backBuffer,此变量初始化成自定义控件的大小,并用此位图生成一个绘图表面g,先讲控件绘制到g上,最后将位图_backBuffer一次绘制到e.Graphics绘图表面,也就是屏幕上。示例代码如下:

  1. if (_backBuffer == null)   
  2. {   
  3.     _backBuffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);   
  4. }   
  5. Graphics g = Graphics.FromImage(_backBuffer);   
  6. OwnerDraw(g);   
  7. g.Dispose();   
  8. pe.Graphics.DrawImageUnscaled(_backBuffer, 0, 0);  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值