双缓冲技术解决屏幕刷新闪烁
来源:互联网 发布:阿里一键上传到淘宝 编辑:程序博客网 时间:2024/04/30 08:21
1. 屏幕刷新时产生闪烁的原因
在MFC对话框上画图形,当需要显示新的图形或使原来的图形显示发生变化时,就需要刷新背景,也就是用背景颜色的画刷把背景重新刷一遍,这样就把原来的图形覆盖掉了,然后画上新图形,即可完成图形的刷新显示或动态显示。但是由于背景颜色(一般是白色)与图形颜色之间的反差,在不断的刷新、显示、刷新、显示过程中就会产生闪烁。这里要强调一下,闪烁本质上就是反差,反差越大,闪烁就越厉害。所以总结来说就是,当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint进行重绘,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。
2. 双缓冲技术基本原理
我们知道在我们电脑中,屏幕中显示的东西都会被放在一个称为显示缓存的地方,在通常情况下我们只有一个这样的缓冲区,也就是单缓冲,在单缓冲中任何绘图的过程都会被立即显示在屏幕中,而所谓双缓冲就是再这个显示的缓冲区之外再建立一个不显示的缓冲区,我们所有的绘图都将在这个不显示的缓冲区中进行,只有当一帧都绘制完了之后才会被拷贝到真正的现实缓冲区显示出来,这样中间过程对于最终用户就是不可见的了,那即使是速度比较慢也只会出现停顿而不会有闪烁的现象出现。其基本原理如图2-1所示。
双缓冲技术的基本思路是:
- 在内存中新建一个临时缓存区;
- 新建一个位图对象作为画布并绑定临时缓存区,绘图在该缓存区中进行;
- 当所有图形绘制完成后,把位图对象贴到显示缓存区中(由于是非常规整的内存拷贝,因此速度非常快),因为内存中的图形与屏幕显示图形差别很小,这样看起来就不会闪烁。
3. 双缓冲技术的实现
在OnPaint()函数中的实现代码如下:
void OnPaint(){ // 获得窗口设备描述表 CPaintDC pDC(this); // 获取窗口客户区 CRect rect; GetClientRect(&rect); //用于缓冲作图的内存DC CDC dcMem; //内存中承载临时图象的位图 CBitmap bmp; //依附窗口DC创建兼容内存DC dcMem.CreateCompatibleDC(&pDC); //创建兼容位图 bmp.CreateCompatibleBitmap(&pDC,rect.Width(),rect.Height()); //将位图选择进内存DC CBitmap *pOldBmp = dcMem.SelectObject(&bmp); //按原来背景填充客户区,不然会是黑色 dcMem.FillSolidRect(rect,RGB(240, 240, 240)); // 绘制图形 DrawSomething(&dcMem); // 将内存DC上的图象拷贝到前台 pDC.BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY); dcMem.SelectObject(pOldBmp); DeleteObject(&bmp); // 删除位图 dcMem.DeleteDC(); // 删除DC DeleteObject(pOldBmp); // 删除备份位图}
然后重载窗口的OnEraseBkgnd()函数,使背景刷变成透明的,实现代码如下:
BOOL OnEraseBkgnd(CDC* pDC){ return TRUE;}
4. 注意事项
当窗口中有控件时,需要把窗口对话框属性Clip Children设置为True,这样在重绘父窗口时就不会刷新子控件的背景,否则界面重绘时控件由于重绘还是会发生闪烁。
5. 参考资料
[1] http://blog.csdn.net/shuilan0066/article/details/6749561
[2] http://blog.csdn.net/acs713/article/details/16359551
[3] http://jingyan.baidu.com/article/4b52d7025f0afefc5c774b12.html
- 双缓冲技术解决屏幕刷新闪烁
- 双缓冲方法解决屏幕刷新闪烁的问题
- bitmap双缓冲技术-防止屏幕闪烁
- java双缓冲解决屏幕闪烁
- 利用双缓冲技术解决图像闪烁
- 基于双缓冲技术解决视图刷新重绘闪烁问题
- MFC利用双缓冲实现屏幕无闪烁刷新
- MFC利用双缓冲实现屏幕无闪烁刷新
- 利用双缓冲解决屏幕图像闪烁问题
- 双缓冲加重载onpaint,OnEraseBkgnd解决屏幕闪烁问题
- 双缓冲加重载onpaint,OnEraseBkgnd解决屏幕闪烁问题
- VC++绘图时,利用双缓冲解决屏幕闪烁
- 利用双缓冲解决游戏开发中的屏幕闪烁问题
- 用双缓冲技术解决刷新屏幕时的闪屏问题
- 应用双缓冲技术解决画面闪烁的问题
- 解决J2ME画面闪烁的问题--双缓冲技术
- 应用双缓冲技术解决画面闪烁的问题
- Java Swing 双缓冲技术解决图像闪烁问题
- 【JZOJ4910】【NOIP2017模拟12.3】子串
- 用 Flask 来写个轻博客 (22) — 实现博客文章的添加和编辑页面
- c++继承与派生
- Sum Root to Leaf Numbers
- 异或规则及实现两数字交换
- 双缓冲技术解决屏幕刷新闪烁
- Meta http-equiv属性详解
- 解决在Vue项目中时常因为代码缩进导致页面报错的问题
- 模型压缩之 BinaryNet
- taskDelay()滥用的结果~
- 字符设备
- 第十五周 项目1 -验证算法
- 提取一堆数字中出现次数最多的数字
- 准等腰毕氏三角形