在使用MFC进行图形绘制时,如果是频繁的刷新绘制会导致屏幕出现明显的闪烁,这是因为绘制时的刷新其实是不断地在进行新帧与旧帧的覆盖工作,我们一般使用的是屏幕DC来进行直接绘制,其速度是比较慢的,double-buffering(双缓冲技术)主要用于解决这种因单缓冲擦除图像时所带来的屏幕闪烁问题,它使用内存dc,先将待绘制的像素以位图(bmp)的形式存在内存里,再将位图绘制于屏幕上,其速度要快很多,可以解决一般的屏幕闪烁问题。
CDC *pDC=GetDC();
CDC MemDC; //定义一个显示设备对象
MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示兼容的内存显示设备
CRect rect;
GetClientRect(&rect);
CBitmap NewBitmap,*OldBitmap; //定义位图对象
NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); //以左上角为起点
OldBitmap=MemDC.SelectObject(&NewBitmap); //将位图选入到内存显示设备中
MemDC.FillSolidRect(rect,pDC->GetBkColor()); //用背景色将屏幕清除干净
DrawCoordinate(&MemDC);
//绘图
DrawSomething(&MemDC);
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,rect.left,rect.top,SRCCOPY);//将内存中的图拷贝到屏幕上进行显示
ReleaseDC(pDC);
MemDC.SelectObject(OldBitmap); //绘图完成后的清理
NewBitmap.DeleteObject();