MFC 双缓冲技术和兼容DC
2017-08-21 15:51
169 查看
转载地址:http://blog.csdn.net/gameloft9/article/details/23760677
一、绘图时屏幕闪烁的原因分析:
屏幕闪烁的根本原因是相邻两帧图像之间存在的巨大差异造成的,而windows的图形刷新方式使得任何两帧图像之间都存在着巨大的差异。因为windows在进行刷新之前都会首先将整个屏幕刷成白色,就相当于在电影胶片的相邻两帧之间都插入了一个白色的帧,这也就是为什么屏幕闪烁时总是看到一个隐约的白色窗口在闪烁而不是一个红色的窗口在闪烁。双缓冲图形刷新避免了windows刷新的问题,其没有在连续的两帧之间插入白色的帧,从而解决了屏幕闪烁的问题。
二、双缓冲图形刷新的原理
传统的绘图方式实际上是一种单缓冲,在windows中每一种设备都在内存中有一个设备描述表(DC)与其对应,这个设备描述表实际上就是一个内存缓冲区。传统的绘图中我们是将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中进行显示。这样一个自动的拷贝过程屏蔽了传统的绘图方式是单缓冲的实质,使我们感觉到我们是在直接操纵显存一样。双缓冲图形刷新技术在内存中有两片缓存,除了设备描述表以外还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区(兼容DC)。绘图过程中,首先将图形绘制在后备缓冲区中,然后在手动的将后备缓冲区中的图像拷贝到前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图形的显示过程。
三、双缓冲图形刷新的实现步骤
1、创建兼容DC。
2、创建位图并加载图片,并调入兼容DC中。(没有位图的设备描述表是不能绘图的)
3、将内存设备描述表中的内容拷贝到窗口设备描述表
4、释放设备描述表句柄、位图等资源
例子:
在vc 6.0中结合mfc实现双缓冲图形刷新技术
1、首先在OnDraw()或者OnPaint()中添加下列代码
[cpp] view
plaincopy
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();
}
一、绘图时屏幕闪烁的原因分析:
屏幕闪烁的根本原因是相邻两帧图像之间存在的巨大差异造成的,而windows的图形刷新方式使得任何两帧图像之间都存在着巨大的差异。因为windows在进行刷新之前都会首先将整个屏幕刷成白色,就相当于在电影胶片的相邻两帧之间都插入了一个白色的帧,这也就是为什么屏幕闪烁时总是看到一个隐约的白色窗口在闪烁而不是一个红色的窗口在闪烁。双缓冲图形刷新避免了windows刷新的问题,其没有在连续的两帧之间插入白色的帧,从而解决了屏幕闪烁的问题。
二、双缓冲图形刷新的原理
传统的绘图方式实际上是一种单缓冲,在windows中每一种设备都在内存中有一个设备描述表(DC)与其对应,这个设备描述表实际上就是一个内存缓冲区。传统的绘图中我们是将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中进行显示。这样一个自动的拷贝过程屏蔽了传统的绘图方式是单缓冲的实质,使我们感觉到我们是在直接操纵显存一样。双缓冲图形刷新技术在内存中有两片缓存,除了设备描述表以外还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区(兼容DC)。绘图过程中,首先将图形绘制在后备缓冲区中,然后在手动的将后备缓冲区中的图像拷贝到前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图形的显示过程。
三、双缓冲图形刷新的实现步骤
1、创建兼容DC。
2、创建位图并加载图片,并调入兼容DC中。(没有位图的设备描述表是不能绘图的)
3、将内存设备描述表中的内容拷贝到窗口设备描述表
4、释放设备描述表句柄、位图等资源
例子:
在vc 6.0中结合mfc实现双缓冲图形刷新技术
1、首先在OnDraw()或者OnPaint()中添加下列代码
[cpp] view
plaincopy
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();
}
相关文章推荐
- MFC 双缓冲技术和兼容DC
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- 通过小练习掌握MFC知识点之起步篇-父子窗口间传值、ListCtrl隔行变色、双缓冲技术解决控件闪烁、自定义消息等
- 双缓冲技术解决MFC重绘闪烁问题
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- MFC 双缓冲技术 【转】
- MFC中的图象保存--关于兼容DC和CMetaFileDc的用法
- DC-DC转换器的电磁兼容技术
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- 双缓冲技术做到MFC绘图不闪烁!!
- MFC三种不同方式实现图形的保存和重绘---方法一:通过兼容DC(CompatibleDC)的方式
- MFC-双缓冲技术
- MFC三种不同方式实现图形的保存和重绘---方法一:通过兼容DC(CompatibleDC)的方式
- [转载] MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- win32 窗口 双缓冲技术 内存DC 绘制直线
- 【MFC】利用双缓冲技术解决屏闪问题
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- MFC 双缓冲技术
- 十年MFC经历认识的Microsoft技术[转]