1、双缓冲的技术原理:
在Windows中每一种设备都在内存中有一个设备描述表与其对应,这个设备描述表实际上就是一个内存缓冲区。
传统的绘图是单缓冲,将图形绘制在设备描述表缓冲区中,然后由gdi自动的将设备描述表中的图像拷贝到显存中。
采用双缓冲绘图是在内存中有两片缓存,除了设备描述表以外,还有一个需要手动建立的与设备描述表缓冲区(前端缓冲区)相兼容的后备缓冲区;
绘图过程中,首先将图形绘制在后备缓冲区中,然后再手动将后备缓冲区中的图像拷贝到前端缓冲区中,再由gdi自动将前端缓冲区中的图像拷贝到显存完成图像的显示过程。双缓冲绘图的目的是为了解决:屏幕闪烁问题!
2、实现步骤:
- 创建与窗口设备描述表( 前端缓冲区)兼容的内存设备描述表(后备缓冲区)
- 创建与内存设备描述表相兼容的位图,并将位图选入内存设备描述表(没有位图的设备描述表是不能绘图的)
- 将图形绘制再内存设备描述表中
- 将内存设备描述表中的内容拷贝到窗口设备描述表
- 释放设备描述表句柄、位图等资源
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();