C#:使用双缓冲让界面绘制图形时避免闪烁
2010-07-26 18:06
381 查看
以前做用户控件的时候喜欢拿已有的基础控件来拼。
发现这样做用户控件比较方便。
但是在控件投入大量使用之后,发现这种做法对控件的速度影响非常大。
如果一个控件是由1个Label,一个TextBox复合而成的。
那么创建一个这样的控件就相当于要生成2个控件。在设计界面和程序启动的时候速度明显感觉到变慢了。
于是全部重新修改,尽量把能不用控件的地方全部改成绘制。
比如Label用画出来的文字去替代。
比如一个日历控件上的31天的日期,以前用的Label,或者Button。
现在全部换成画出来的。创建速度从20毫秒加快到了0毫秒。
随之而来带来的一个问题就是。绘画的操作太多。导致界面闪烁比较严重。
问了一下公司的前辈,得到了下面的一个方法。使用之后确实完全没有闪烁了。。十分吃惊。赶紧记下。
将这段代码加到用户控件的构造函数中即可生效。
这段代码的主要功能是开启了双缓冲。
平时我以为开双缓冲只需要设置ControlStyles.OptimizedDoubleBuffer为true而已。
但是经过实践才发现,起关键作用的是OptimizedDoubleBuffer和AllPaintingInWmPaint两个。
当这两个都为true的时候。闪烁几乎消失。效果非常好。所以我在这里记下。
给自己,也给大家。
发现这样做用户控件比较方便。
但是在控件投入大量使用之后,发现这种做法对控件的速度影响非常大。
如果一个控件是由1个Label,一个TextBox复合而成的。
那么创建一个这样的控件就相当于要生成2个控件。在设计界面和程序启动的时候速度明显感觉到变慢了。
于是全部重新修改,尽量把能不用控件的地方全部改成绘制。
比如Label用画出来的文字去替代。
比如一个日历控件上的31天的日期,以前用的Label,或者Button。
现在全部换成画出来的。创建速度从20毫秒加快到了0毫秒。
随之而来带来的一个问题就是。绘画的操作太多。导致界面闪烁比较严重。
问了一下公司的前辈,得到了下面的一个方法。使用之后确实完全没有闪烁了。。十分吃惊。赶紧记下。
SetStyle( ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.Selectable | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);
将这段代码加到用户控件的构造函数中即可生效。
这段代码的主要功能是开启了双缓冲。
平时我以为开双缓冲只需要设置ControlStyles.OptimizedDoubleBuffer为true而已。
但是经过实践才发现,起关键作用的是OptimizedDoubleBuffer和AllPaintingInWmPaint两个。
当这两个都为true的时候。闪烁几乎消失。效果非常好。所以我在这里记下。
给自己,也给大家。
相关文章推荐
- C#:使用双缓冲让界面绘制图形时避免闪烁
- C#:使用双缓冲让界面绘制图形时避免闪烁
- C#:使用双缓冲让界面绘制图形时避免闪烁
- 使用双缓冲让界面绘制图形时避免闪烁 整理
- 绘制图片时使用双缓冲机制,避免闪烁
- 源码推荐:一个使用C#绘制图形引擎的Framework
- WTL使用双缓冲避免重绘闪烁
- 基于WTL中使用双缓冲避免闪烁的解决方法
- C#之使用NotifyIcon实现任务栏托盘菜单,图标闪烁效果及气泡提示 很多程序是只需要后台运行的,甚至不需要自己的应用界面。NotifyIcon提供了程序在任务栏的显示功能 程序下载链接如下
- c#画笔Pen使用路径绘制图形
- 双缓冲解决高频率刷新界面闪烁问题(C#)
- C++零食:WTL中使用双缓冲避免闪烁
- WTL使用双缓冲避免重绘闪烁
- C++零食:WTL中使用双缓冲避免闪烁
- WTL使用双缓冲避免重绘闪烁
- C++零食:WTL中使用双缓冲避免闪烁
- C#学习笔记之使用GDI绘制简单的图形
- VC使用双缓冲避免绘图闪烁的正确使用方法【转】
- WTL使用双缓冲避免重绘闪烁
- 源码推荐:一个使用C#绘制图形引擎的Framework