解决自绘制控件闪烁的问题
记得以前用VC开发自绘制控件的时候,遇到的一个很烦人的问题就是控件在paint的时候总是出现flicker(闪烁)。原因其实很简单,就是你一点一点的向设备上下文环境绘制,中间还有很多逻辑运算,结果就像是动画了,不过计算机的速度比较快,所以呈现在我们面前的闪烁,而闪烁的出现大大的影响的客户的使用体验。后来一个程序员开发了一个后来广为流传的类MemDC,这个类首先创建一个兼容的设备上下文环境,将所有的绘制工作放到这个类里完成,最后将绘制好的内容一次性的帖(bitblt)到实际的上下文环境,这样就解决的闪烁的问题,这就是双缓存机制。这个类是如此简洁好用,以至于很多的开源的控件里都用到了这个类。
好了,言归正传,说说dotnet控件是怎么解决闪烁问题的。既然双缓存机制是如此的有效而且实现又不是很复杂,微软一定是很乐意将它作为自己的标准。最近研究dotnet控件的制作,看了看control的文档,才发现微软在dotnet控件的基类Control类里已经提供的这种机制。现在如果你想在自己的控件里实现双缓存机制,只需要简单的设置控件的风格就可以了。如果你的控件是派生于Control类的话,你只需要在你的控件造函数里加上下边几行代码:
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
另外你也可以使用下面的代码:
this.DoubleBuffered =true;
好了,言归正传,说说dotnet控件是怎么解决闪烁问题的。既然双缓存机制是如此的有效而且实现又不是很复杂,微软一定是很乐意将它作为自己的标准。最近研究dotnet控件的制作,看了看control的文档,才发现微软在dotnet控件的基类Control类里已经提供的这种机制。现在如果你想在自己的控件里实现双缓存机制,只需要简单的设置控件的风格就可以了。如果你的控件是派生于Control类的话,你只需要在你的控件造函数里加上下边几行代码:
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
另外你也可以使用下面的代码:
this.DoubleBuffered =true;