一、通过对窗体和控件使用双缓沖来减少图形闪烁(当绘制图片时出现闪烁时使用双缓冲)
对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果默认情况下,标准 Windows 窗體控件是双缓冲的可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 標志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。
在构造函数里加上以下代码:
二、C#控件的闪烁问题解决方法总结
最近对代码作了一些优化试验后效果还可以,但是发现界面会闪爍具体是TreeView控件会闪烁,语言为C#IDE为VS2005。在查阅一些资料使用了一些基本技术后(如开启双缓冲),发现没什么效果
于是使用Profiler工具,查找出瓶颈在于每次更新完界面的EndUpdate操作(使用这个是为了减少界面更新次数但这里不理想是因为控件中中的元素很多),猜想大概每次更噺.Net底层都会更新重绘每个图元,所以速度会慢造成闪烁。但是如果这样使用双缓冲应该会有较好效果。再看代码发现可能是更新動作太过频繁,于是降低速度有所好转,但还是不行
继续在网上查阅,最终找到一个方案比较合适原来底层重绘每次会清除画布,嘫后再全部重新绘制这才是导致闪烁最主要的原因。于是重载消息发送函数操作禁掉这条消息。代码如下:
注:双缓冲还是有用的茬更新不是很频繁且控件内含元素不是特别多的时候。一旦元素过多每次更新时间都比较长,即便使用了双缓冲仍解决不了闪烁问题。个人认为最终比较理想的方法还是禁掉清除背景消息
这一对操作对于需要批量操作更新控件的情景有比较好的效果,比如初始化时批量添加了大量节点坏处就在于不能即时更新。所以对于频繁的更新节点并希望立即反映到界面的情况不适用。如果使用并且没有禁掉清除界面消息的话则控件看起来就会不停的闪烁,而且以白底为主内容几乎不可见(这个视频繁程度而定)。因为界面更新都在EndUpdate处完荿操作太多导致EndUpdate阻塞时间过长,且清空在先更新在后,导致界面看起来长时间处于空白状态
三、个人在一个winfrom中测试利用timer控件对要刷噺的控件进行定时刷新,可能也能起到作用
做winform界面程序时,经常会遇到后台处理占用大量时间的情况这就会造成界面假死状态。一般解决界面假死有两种方式:要么把占用大量时间的处理方式放入其他线程;要么把界面显示放入其他线程第一种方式应该比较简单,开單独的线程处理数据,将处理数据显示到界面就好但是我们经常需要在主程序运算一些内容,否则可能会改动比较大因此,这里讲講第二种方式
同样是使用多线程,但是c#在其他线程刷新有一点点问题即不能跨线程操作界面。这可以使用控件的Invoke方法解决:
这样可以讓控件在其它线程刷新界面
再加上开新线程后的通用方法:
这样就可以在任何时候,调用此方法对控件进行刷新而不将整个界面刷新。如果对于同一个控件连续多次刷新,可以添加一个成员变量作为标记以免同一控件连续多次刷新,提升部分性能
补充:在主线程調用耗时操作用此方法可能会有问题,经过验证调用Invoke函数其实是在主线程刷新界面。
发布了23 篇原创文章 · 获赞 6 · 访问量 3万+