首页 理论教育双缓冲防闪烁技术,MFC视频教程

双缓冲防闪烁技术,MFC视频教程

【摘要】:创建一个工程名为“Flys”的对话框程序,演示当越来越多的蝴蝶飞舞时界面发生闪烁,然后通过双缓冲技术加以解决。10)修改OnTimer函数的代码,使用双缓冲技术消除动画闪烁问题。“双缓冲技术”创建一个和窗口画面相同大小的内存DC,就相当于在内存中打一张“草稿”,将所有前景和背景图都粘贴完好后再一次性地输出到屏幕。“双缓冲技术”解决画面闪烁的方法,广泛地应用在各类高级图形界面的开发中。

闪烁的原因并不是因为绘图速度太快或太慢,而是因为画面输出次数太多,背景和前景画面互相覆盖形成了视觉差造成的。解决闪烁问题的关键,就是禁止在一次界面更新中多次画面输出。具体办法可以归纳为以下4种。

1)非客户区和客户区不能同步更新画面造成的闪烁,可以去掉窗口的标题和边框。只在WM_PAINT消息回调时绘画,而在WM_NCPAINT消息回调中不绘画。例如,QQ、360等软件皆是如此。

2)客户区内背景和前景不能同步更新画面,在WM_ERASEBKGND背景更新和WM_PAINT前景更新两个消息中,只选择一种消息回调时绘画而在另一个消息回调时不绘画。

3)Invalidate强制更新客户区函数,代入FALSE只更新前景而不更新背景,可以减少客户区闪烁。或者说代入FALSE只通知WM_PAINT消息回调,而不通知WM_ERASEBKGND消息回调。

4)即使只在客户区中输出画面,如果画面输出的背景图和角色图形太多,则还会发生背景图和角色之相互覆盖造成画面闪烁。解决这个问题必须使用“双缓冲防闪烁”技术。

创建一个工程名为“Flys”的对话框程序,演示当越来越多的蝴蝶飞舞时界面发生闪烁,然后通过双缓冲技术加以解决。

1)将本章第5节的MemDC.h文件复制到工程目录下,添加到编译列表并保存文件列表,如图8-19所示。

2)将本章第4节示例中用到的图片(img目录),复制到新工程目录下,如图8-20所示。

978-7-111-46378-8-Chapter08-48.jpg

图8-19 将MemDC.h文件 添加到编译列表

978-7-111-46378-8-Chapter08-49.jpg

图8-20 图片素材(蝴蝶背景色是黑色)

3)在主对话框类中添加一些成员变量

978-7-111-46378-8-Chapter08-50.jpg

4)在主对话框类中添加一个私有的成员函数,用于加载图片。

978-7-111-46378-8-Chapter08-51.jpg

5)修改对话框初始化函数。(www.chuimin.cn)

978-7-111-46378-8-Chapter08-52.jpg

6)添加WM_LBUTTONDOWN消息映射函数。

978-7-111-46378-8-Chapter08-53.jpg

978-7-111-46378-8-Chapter08-54.jpg

7)在主对话框类中添加一个私有成员函数OnDraw,根据链表中的数据绘制动画

978-7-111-46378-8-Chapter08-55.jpg

8)添加WM_TIMER消息映射并修改代码。

978-7-111-46378-8-Chapter08-56.jpg

9)编译并运行,测试代码。

每次鼠标单击画面,就增加一只飞舞的蝴蝶。当蝴蝶数量越来越多时,界面闪烁得非常厉害。

10)修改OnTimer函数的代码,使用双缓冲技术消除动画闪烁问题。

978-7-111-46378-8-Chapter08-57.jpg

978-7-111-46378-8-Chapter08-58.jpg

11)重新编译并运行,测试代码。

当画面增加了非常多的蝴蝶后,动画运行仍然非常平滑无任何闪烁。“双缓冲技术”创建一个和窗口画面相同大小的内存DC,就相当于在内存中打一张“草稿”,将所有前景和背景图都粘贴完好后再一次性地输出到屏幕。“双缓冲技术”解决画面闪烁的方法,广泛地应用在各类高级图形界面的开发中。