目的:
原因是绘图(前景)与显示器(背景)刷新不同步,有时间差,眼睛看上去好像在闪烁。为解决这一问题,这就需要用到双缓冲技术来绘图了。双缓冲技术是相对单缓冲而言的,单缓冲就是直接在设备DC上绘图;而双缓冲就是先在一个与设备DC相兼容的内存缓冲区里进行绘图,然后再一次性复制到设备DC上。一次性在屏幕上显示就不会出现闪烁的现象。
一、双缓冲技术的使用
双缓冲绘图步骤:
1.在内存中创建兼容DC缓冲区(依次包括创建兼容DCCreateComatibleDC、创建画布CreatrCompatibleBitnap、将画布选入SelectObject)。
2.在缓冲区进行画图操作(可以画图形、也可以贴位图)。
3.将兼容缓冲区一次性复制到设备DC上。(复制用Bitblt函数)
4.释放内存缓冲区。(DeleteDC函数)
几个关键API函数:
CreateCompatibleDC:
该函数创建一个与指定设备兼容的内存设备上下文环境(DC)
HDC CreateCompatibleDC(HDC hdc);
CreateCompatibleBitmap:
该函数创建与指定的设备环境相关的设备兼容的位图
HBITMAP CreateCompatibleBitmap(HDC hdc,
int nWidth, // 定位图的宽度,单位为像素
int nHeight);// 指定位图的高度,单位为像素
BitBlt:
BitBlt是一个计算机函数,该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境
BOOL BitBlt( _In_ HDC hdcDest,
_In_ int nXDest, // 指定目标矩形区域左上角的X轴逻辑坐标
_In_ int nYDest, // 指定目标矩形区域左上角的Y轴逻辑坐标
_In_ int nWidth, // 指定源在目标矩形区域的逻辑宽度
_In_ int nHeight, // 指定源在目标矩形区域的逻辑高度
_In_ HDC hdcSrc, // 指向源设备环境的句柄
_In_ int nXSrc, // 指定源矩形区域左上角的X轴逻辑坐标
_In_ int nYSrc, // 指定源矩形区域左上角的Y轴逻辑坐标
_In_ DWORD dwRop); //指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
单双缓冲技术操作对比:
单缓冲技术绘制两个矩形:
// 直接在设备DC上绘制
Rectangle(hdc, 100, 100, 200, 200);
Rectangle(hdc, 300, 300, 200, 200);
双缓冲技术绘制两个矩形:
// 1.创建兼容缓冲区
mdc = CreateCompatibleDC(hdc); // 创建兼容DC
bmp = CreateCompatibleBitmap(hdc, 600, 600); // 创建兼容位图画布
SelectObject(mdc, bmp); // 选入
// 2.在缓冲区绘制
Rectangle(mdc, 100, 100, 200, 200);
Rectangle(mdc, 300, 300, 200, 200);
// 3.一次性复制到设备DC
BitBlt(hdc, 0, 0, 500, 500, mdc, 0, 0, SRCCOPY);
// 4.释放缓冲区DC
DeleteDC(mdc);