双缓冲刷新图像:避免自绘时图像闪烁

1、双缓冲的技术原理:
在Windows中每一种设备都在内存中有一个设备描述表与其对应,这个设备描述表实际上就是一个内存缓冲区
传统的绘图是单缓冲,将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中。

采用双缓冲绘图是在内存中有两片缓存,除了设备描述表以外,还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区

绘图过程中,首先将图形绘制在后备缓冲区中,然后再手动后备缓冲区中的图像拷贝前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图像的显示过程。双缓冲绘图的目的是为了解决:屏幕闪烁问题!

2、实现步骤:

  1. 创建与窗口设备描述表( 前端缓冲区)兼容的内存设备描述表(后备缓冲区)
  2. 创建与内存设备描述表相兼容的位图,并将位图选入内存设备描述表(没有位图的设备描述表是不能绘图的)
  3. 将图形绘制再内存设备描述表中
  4. 将内存设备描述表中的内容拷贝到窗口设备描述表
  5. 释放设备描述表句柄、位图等资源

3、举例

这里的pDC:是窗口设备描述表(前端缓冲区);

MemDC:是手动创建的一个内存设备描述表(后端缓冲区);

通过BitBlt函数:将后端缓冲区 手动拷贝到 前端缓冲区;

CDC MemDC;//定义一个内存设备描述表对象(即后备缓冲区)
CBitmap MemBitmap;//定义一个位图对象

MemDC.CreateCompatibleDC(NULL);//建立与窗口设备描述表(前端缓冲区)兼容的内存设备描述表句柄(后备缓冲区)
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,hHeight,&MenDC,0,0,SRCCOPY);//将后备缓冲区中的图形拷贝到前端缓冲区

MemBitmap.DeleteObject();
MemDC.DeleteDC();

参考:【学习总结】MFC(CImagelist)(重绘)(双缓冲) - 灰信网(软件开发博客聚合)

你可能感兴趣的:(#,MFC自绘,windows)