这是个老生常谈的问题,有过vc编写界面的经验的人大都遇过,至于问题产生的原因,网上已有太多描述,这里只给出几个解决方法的建议。
1、双缓冲,这个是基本是必须的处理方式,同时最好处理WM_ERASEBKGND消息。
2、有些情况尽管使用了双缓冲,但是在窗口拉伸的时候还是有闪烁的情况,例如界面控件很复杂,基本都为自绘控件时。这时窗口的WS_CLIPCHILDREN | WS_CLIPSIBLINGS属性或许是有帮助的,窗口被设置该属性后,所有的子控件都是自己处理绘制。这时难免会带来一些例如子窗口背景绘制的问题(GroupBox比较明显,各位可以尝试一下)。这时需要所有的子控件都要自己处理背景。360安全卫士即通过这种方式解决界面刷新问题,具体可以spy++抓抓看。
3、最终解决方案,在主窗体存在大量子窗口时,其中的关键就是ExcludeClipRect。通过该函数根据子窗口类型,动态设置窗口的裁剪区域。子窗口根据实际需要做相应的自绘处理,这样就既保证了效率,又保证了扩展的灵活性。UISkinX界面库即是通过该方式实现。