今天无意发现之前写的一个小工具在缩放窗口的时候,出现闪屏,主要有两个位置:
- 工具栏出一闪屏
- 右侧的控制面板出现闪屏 (这个控制面板与多层元件组合而成)
之前真没注意到这个问题,平时都是最大化/恢复窗口,没缩放窗口,所以没发现这样的问题。
网上搜索了一下,找到一些解决方案:
[百度文库] VC窗口闪烁问题的解决 - http://wenku.baidu.com/view/3c7e747931b765ce0508146a.html
我遇到的问题属于第2种情况:
原因二: 复杂的界面有多层窗口组成,当windows在窗口改变大小的时候是先重画父窗口,然后重画子窗口,子父 窗口重画的过程一般无法在一个刷新周期内完成,所以会呈现闪烁。 我们知道父窗口上被子窗口挡住的部分其实没必要重画的 解决方法:给窗口加个风格 WS_CLIPCHILDREN ,这样父窗口上被子窗口挡住的部分就不会重画了。 如果同级窗口之间有重叠,那么需要再加上 WS_CLIPSIBLINGS 风格
我在创建主窗口的相关代码中加一个dwStyle: WS_CLIPCHILDREN
就解决了闪屏的问正式。
今天还发现一个新的 dwExStyle:WS_EX_COMPOSITED (xp下什么双缓冲绘图机制)
相关的介绍:
http://www.cppblog.com/xfpl-at-hotmail-dot-com/archive/2009/10/10/98261.html?opt=admin
http://blog.sina.com.cn/s/blog_874559b70100thqy.html
我在一个多层次控件的父窗口,其实就是一个类似java中的JPanel上,设置 dwExStyle: WS_EX_COMPOSITED
竟然可以解决缩放窗口时JPanel中控件重绘造成的闪屏情况。
但是,当我把这个指定给一个画图片的面板上,发现虽然彻底解决了图片重绘时的闪屏问题,但是电脑的CPU占用达到50%.
看来这个 dwExStyle: WS_EX_COMPOSITED 是要付出代价的.
2014-01-11