使用双缓冲让界面绘制图形时避免闪烁 整理

 

以前做用户控件的时候喜欢拿已有的基础控件来拼。

发现这样做用户控件比较方便。

但是在控件投入大量使用之后,发现这种做法对控件的速度影响非常大。

如果一个控件是由1个Label,一个TextBox复合而成的。

那么创建一个这样的控件就相当于要生成2个控件。在设计界面和程序启动的时候速度明显感觉到变慢了。

于是全部重新修改,尽量把能不用控件的地方全部改成绘制。

比如Label用画出来的文字去替代。

比如一个日历控件上的31天的日期,以前用的Label,或者Button。

现在全部换成画出来的。创建速度从20毫秒加快到了0毫秒。

随之而来带来的一个问题就是。绘画的操作太多。导致界面闪烁比较严重。

问了一下公司的前辈,得到了下面的一个方法。使用之后确实完全没有闪烁了。。十分吃惊。赶紧记下。

 

  1. SetStyle(  
  2.                      ControlStyles.OptimizedDoubleBuffer  
  3.                      | ControlStyles.ResizeRedraw  
  4.                      | ControlStyles.Selectable  
  5.                      | ControlStyles.AllPaintingInWmPaint  
  6.                      | ControlStyles.UserPaint  
  7.                      | ControlStyles.SupportsTransparentBackColor,  
  8.                      true);  
 

 

将这段代码加到用户控件的构造函数中即可生效。

这段代码的主要功能是开启了双缓冲。

平时我以为开双缓冲只需要设置ControlStyles.OptimizedDoubleBuffer为true而已。

但是经过实践才发现,起关键作用的是OptimizedDoubleBuffer和AllPaintingInWmPaint两个。

当这两个都为true的时候。闪烁几乎消失。效果非常好。所以我在这里记下。

给自己,也给大家。

 

 

 

 

 

================================================================================

 

如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在更新的时候都会不断地闪烁,解决方法就是在这个窗体的构造函数中增加以下三行代码:


请在构造函数里面底下加上如下几行:
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲

参数说明:

UserPaint 
如果为 true,控件将自行绘制,而不是通过操作系统来绘制。此样式仅适用于派生自 Control 的类。

AllPaintingInWmPaint 
如果为 true,控件将忽略 WM_ERASEBKGND 窗口消息以减少闪烁。仅当 UserPaint 位设置为 true 时,才应当应用该样式。

DoubleBuffer 
如果为 true,则绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁。要完全启用双重缓冲,还必须将 UserPaint 和 AllPaintingInWmPaint 样式位设置为 true。 

 

你可能感兴趣的:(button,日历,图形,textbox)