没有合适的资源?快使用搜索试试~ 我知道了~
MFC控件闪烁问题汇总以及解决方案,有详细的说明,以及代码,可以到自己的程序中进行调试,以便于帮助大家解决问题
资源推荐
资源详情
资源评论
绘图时屏幕闪烁的原因分析
很长一段时间我一直认为绘图过程中出现的屏幕闪烁是图形刷新速度过快而造成的(相信
有很多朋友也跟我一样有这样的想法),但是通过编写一些绘图程序,我发现事情并非如
此,至少刷新速度快不会是造成屏幕闪烁的根本原因。这个问题可以通过下面的两个试验
进行说明。
1、编写一个刷新速度很慢的应用程序,可以设计为通过点击鼠标来进行屏幕刷新。通过
该试验可以发现即使屏幕的刷新速度很慢,但是在每次刷新的时候仍然存在屏幕的问题,
只是闪烁不是很明显。
2、编写一个刷新速度很快的应用程序,并在程序中应用双缓冲图形刷新技术。通过该试
验可以发现虽然屏幕刷新速度很快,但是采用了双缓冲图新刷新技术以后,屏幕不存在闪
烁。
屏幕闪烁的根本原因是相邻两帧图像之间存在的巨大差异造成的,而 windows 的图形刷新
方式使得任何两帧图像之间都存在着巨大的差异,因为 windows 在进行刷新之前都会首先
将整个屏幕刷成白色,就相当于在电影胶片的相邻两帧之间都插入了一个白色的帧,这也
就是为什么屏幕闪烁时总是看到一个隐约的白色窗口在闪烁而不是一个红色的窗口在闪烁。
双缓冲图形刷新避免了 windows 刷新的问题,其没有在连续的两帧之间插入白色的帧,从
而解决了屏幕闪烁的问题。
双缓冲图形刷新的原理
双缓冲图形刷新顾名思义是采用双缓存实现的。传统的绘图方式实际上是一种单缓冲。在
windows 中每一种设备都在内存中有一个设备描述表与其对应,这个设备描述表实际上就
是一个内存缓冲区。传统的绘图中我们是将图形绘制在设备描述表缓冲区中,然后由 gdi
自动的将设备描述表中的图像拷贝到显存中进行显示。这样一个自动的拷贝过程屏蔽了传
统的绘图方式是单缓冲的实质,使我们感觉到我们是在直接操纵显存一样。双缓冲图形刷
新技术在内存中有两片缓存,除了设备描述表以外还有一个需要手动建立的与设备描述表
缓冲区(前端缓冲区)相兼容的后备缓冲区。绘图过程中,首先将图形绘制在后备缓冲区
中,然后在手动的将后备缓冲区中的图像拷贝到前端缓冲区中,再由 gdi 自动将前端缓冲
区中的图像拷贝到显存完成图形的显示过程。
双缓冲图形刷新的实现步骤
1、创建与窗口设备描述表(前端缓冲区)兼容的内存设备描述表(后端缓冲区)
2、创建与内存设备描述表相兼容的位图并将该位图选入内存设备描述表中(没有位图的
设备描述表是不能绘图的)
3、将图形绘制在内存设备描述表中
4、将内存设备描述表中的内容拷贝到窗口设备描述表
5、释放设备描述表句柄、位图等资源
下面是双缓冲的代码例子
[html]view plaincopy
1. voidOnDraw(CDC*pDC)
2. {
3. //定义一个内存设备描述表对象(即后备缓冲区)ëëëë
资源评论
Larry_666
- 粉丝: 5
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功