MFC 双缓冲技术和兼容DC
来源:互联网 发布:从中国回国的老外 知乎 编辑:程序博客网 时间:2024/05/21 09:02
本文整理自网络。
一、绘图时屏幕闪烁的原因分析:
屏幕闪烁的根本原因是相邻两帧图像之间存在的巨大差异造成的,而windows的图形刷新方式使得任何两帧图像之间都存在着巨大的差异。因为windows在进行刷新之前都会首先将整个屏幕刷成白色,就相当于在电影胶片的相邻两帧之间都插入了一个白色的帧,这也就是为什么屏幕闪烁时总是看到一个隐约的白色窗口在闪烁而不是一个红色的窗口在闪烁。双缓冲图形刷新避免了windows刷新的问题,其没有在连续的两帧之间插入白色的帧,从而解决了屏幕闪烁的问题。二、双缓冲图形刷新的原理
传统的绘图方式实际上是一种单缓冲,在windows中每一种设备都在内存中有一个设备描述表(DC)与其对应,这个设备描述表实际上就是一个内存缓冲区。传统的绘图中我们是将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中进行显示。这样一个自动的拷贝过程屏蔽了传统的绘图方式是单缓冲的实质,使我们感觉到我们是在直接操纵显存一样。双缓冲图形刷新技术在内存中有两片缓存,除了设备描述表以外还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区(兼容DC)。绘图过程中,首先将图形绘制在后备缓冲区中,然后在手动的将后备缓冲区中的图像拷贝到前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图形的显示过程。三、双缓冲图形刷新的实现步骤
1、创建兼容DC。
2、创建位图并加载图片,并调入兼容DC中。(没有位图的设备描述表是不能绘图的)
3、将内存设备描述表中的内容拷贝到窗口设备描述表
4、释放设备描述表句柄、位图等资源
例子:
在vc 6.0中结合mfc实现双缓冲图形刷新技术
1、首先在OnDraw()或者OnPaint()中添加下列代码- void OnDraw(CDC *pDC)
- {
- //定义一个内存设备描述表对象(即后备缓冲区)
- CDC MemDC;
- //定义一个位图对象
- CBitmap MemBitmap;
- //建立与屏幕设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)
- MemDC.CreateCompatibleDC(pDC);
- //这时还不能绘图,因为没有位图的设备描述表是不能绘图的
- //下面建立一个与屏幕设备描述表(或者内存设备描述表)兼容的位图
- MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
- //将位图选入到内存设备描述表
- //只有选入了位图的设备描述表才有地方绘图,画到指定的位图上
- CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
- //先用背景色将位图清除干净,这里我用的是白色作为背景
- //你也可以用自己应该用的颜色
- MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
- //绘图
- MemDC.MoveTo(……);
- MemDC.LineTo(……);
- //将后备缓冲区中的图形拷贝到前端缓冲区
- pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
- //绘图完成后的清理
- MemBitmap.DeleteObject();
- MemDC.DeleteDC();
- }
0 0
- MFC 双缓冲技术和兼容DC
- MFC 双缓冲技术和兼容DC
- 创建兼容DC双缓冲
- MFC双缓冲解决闪烁问题 CreateCompatibleDC 创建内存兼容DC 转载自百度经验
- MFC 双缓冲技术
- MFC 双缓冲技术
- MFC-双缓冲技术
- MFC 双缓冲技术 【转】
- DC-DC转换器的电磁兼容技术
- 兼容DC和兼容位图
- 兼容DC和兼容位图
- 有关内存DC和双缓冲位图的问题汇总
- GdiplusFlat(7)双缓冲绘图和DC透明复制
- 兼容位图和兼容DC的理解
- MFC中的图象保存--关于兼容DC和CMetaFileDc的用法
- 兼容DC
- WINCE双缓冲绘图 Win32和MFC
- 【MFC】利用双缓冲技术解决屏闪问题
- "什么是密码学与信息安全"的访谈
- 用C#语言解压Html源码
- Eclipse上GIT插件EGIT使用手册之三_新建GIT仓库
- 面试常用的4种数组排序
- UVA OJ:445 - Marvelous Mazes
- MFC 双缓冲技术和兼容DC
- Android USB VID PID 及 ADB
- QIWSInputMethod的工作流程
- 宠物专用扫地机器人:可跟在宠物后面随时清理
- 几种类加载方式的区别
- java 学习资料整理
- Eclipse上GIT插件EGIT使用手册之四_配置.gitignore
- phpMyAdmin 高级功能尚未完全设置
- 第八周项目一——运算符重载