关于Invalidate函数(Invalidate(TRUE )闪屏问题)

来源:互联网 发布:淘宝网的图片 编辑:程序博客网 时间:2024/05/09 10:48
 
在論壇看见他们在讨论这样的问题,看见一大批人说,很少人说到重点,如果不是工程很大,绘制效率不会慢的
所以效率方面,很多时候不是你要考虑的,现在对此进行解说。
 
原型:
void Invalidate( BOOL bErase = TRUE );
 
参数: bErase 决定了是否要在WM_PAINT消息前发送WN_ERASEBKGND
 
//下面解析屏幕闪烁的原因。
 
如果使用Invalidate();
 
则默认为TRUE,在刷新的的时候会发送WN_ERASEBKGND,导致整个窗口背景刷除,再重新加载。
 
就算你用了双缓冲,整个窗体画面也会有闪烁,所以你可以调用Invalidate(FALSE);来重新刷新画面。
 
也可以通过添加WN_ERASEBKGND事件,在里面直接return TRUE;那就不会闪烁了。另外,
 
虽然这些操作都可以使你的图片操作不产生闪烁,但是控件可还是会闪烁的,还需要设置窗口为
 
WS_CLIPCHILDREN属性(代码为:ModifyStyle(0,WS_CLIPCHILDREN); ) 
 
这就是很多熟手告诉你为什么直接return TRUE,也是一种方法的原因,其实最根本的原因是你使用
 
了Invalidate(TRUE )而不是Invalidate(FALSE ),此外,我说这个之前,你所以之前的绘制是使用双缓冲的。
 
 
 
1 0