admin管理员组

文章数量:1531349

2024年6月12日发(作者:)

一、闪烁问题。

闪烁问题在MFC窗体中经常见到。在网上碰到这些问题的层次不穷,解决方法也是

多样的!但是最经典也最耐用的还是靠用双缓存解决!首先让我们来了解一下,为什么会

产生屏幕闪烁问题:闪烁可以这样定义:当后面一幅图像以很快的速度画在前面一幅图像

上时,在后面图像显示前,你可以很快看到前面那一个图像,这样的现象就是闪烁。我认

为,闪烁会让使用者对程序很不满,原因是:如果用户接口编码如此糟糕,那么程序的其

他部分呢,如何能相信数据的正确性呢?一个具有平滑,快速相应的程序会给用户带来信

心,这个道理很简单。

程序出现闪烁可以由多种形式造成,最常见的原因是窗口大小发生改变时,其内容重

画造成闪烁。

仅仅画一次

这是一个黄金法则,在任何计算机(Windows或者你使用的任何操作系统)上处理画法

逻辑都需要遵循,即永远不要将同一像素画两次。一个懒惰的程序员常常不愿意在画法逻

辑上投入过多精力,而是采用简单的处理逻辑。要避免闪烁,就需要确保不会出现重复绘制的

情况发生。现在,WIndows和计算机还是很笨的,除非你给他们指令,否则他们不会做

任何事情。如果闪烁的现象发生,那是因为你的程序刻意地多绘制了屏幕的某些区域造成

的. 这个现象可能是因为一些明确的命令,或者一些被你忽视了的地方。如果程序有闪烁

的现象出现,你需要你知道如何找到好的方案去解决这个问题。

WM_ERASEBKGND

通常,首先需要怀疑的是WM_ERASEBKGND消息。当一个窗口的背景需要被擦除时,

这个消息会被发送。这是因为窗口的绘画通常经历了两个过程

WM_ERASEBKGND: 清除背景

WM_PAINT: 在上面绘制内容

这两个过程让窗体在绘制内容时变得很简单,即:每次当收到WM_PAINT消息时,

你知道已经有了一个新画布等待去绘制。然而,画窗口两次(一次是通过

WM_ERASEBKGND画背景,另外一次是WM_PAINT)将会导致窗口出现比较糟糕的闪

烁现象。只要看看标准的编辑框-打开Windows的写字板并改变窗口大小,就可以看到那

种闪烁的效果。

那么,如何避免窗口背景的重刷呢?有如下两种方法:

设置窗口背景刷子为NULL(当注册Windows类时,设置WNDCLASS结构中的

hbrBackground成员为零)

在WM_ERASEBKGND消息处理时 返回非零值

以上任何一种方法都可以阻止WM_ERASEBKGND 消息去清除窗口。其中,第二个

方案的通常可以以如下代码实现:

case WM_ERASEBKGND:

return 1;

本文标签: 闪烁背景需要绘制问题