C++的双缓冲机制

当我们直接在设备上作图时,程序自动反复将作好的图像复制到显示设备上显示,如果背景色与前景色差异很大,实际情况看起来就是界面的频繁闪动。双缓冲机制就是创建一个设备的内存副本,我们在内存上作图,完成后再整体Copy到实际设备上,如此整体的复制粘贴,就可以避免闪烁了。
下面是内存设备的创建
CDC memCdc;//内存设备
CBitmap memBmp;//用于存储所作图的完整图像,注意后面的SelectObject
memCdc.CreateCompatibleDC(&dc);//dc为实际设备
memBmp.CreateCompatibleBitmap(&dc, screenWidth, screenHeight);
memCdc.SelectObject(&memBmp);

之后就可以在memCdc上作图。然后再用下面的代码将完整的图像复制到实际设备dc上。
dc.BitBlt(0, 0, screenWidth, screenHeight, &memCdc, 0, 0, SRCCOPY);
memCdc.DeleteDC();
memBmp.DeleteObject();


当我们要求自己绘制图像后面的背景,同时能少量更改背景上的内容时,可以用内存图片存储我们所作的背景,不再释放该bmp图片(即上面的memBmp,这要求memBmp不再是局部变量),每次重绘背景上的内容时,直接将bmp图片BitBlt复制过去就可以了。当然,在这里依然要注意最后对bmp的释放(或者我们要更新背景时,需要重新释放后再CreateCompatibleBitmap分配)。
if(Cbmp.GetSafeHandle() != NULL)
   Cbmp.DeleteObject();

所以双缓冲的内存作图,不仅可以解决闪烁的问题,还能减少静态背景的重绘次数,避免界面的刷新延迟。

你可能感兴趣的:(C++,c,C#)