过CDC::GetClipBox来获得裁剪区域的大小。
因此,对双缓存的优化代码如下所示:
void CDoubleBufferView::DrawWithBufferEfficient(CDC* pDC)
{
ASSERT_VALID(pDC);
/*创建内存DC*/
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
dcMemory.SetBkColor(pDC->GetBkColor());
/*设置内存DC的画板,大小与输入DC的裁剪区域一样*/
/*只对裁剪区域进行重新绘制*/
CRect rectClip(0,0,0,0);
pDC->GetClipBox(&rectClip);
CBitmap bmpMemory;
bmpMemory.CreateCompatibleBitmap(pDC,
rectClip.Width(), rectClip.Height());
dcMemory.SelectObject(&bmpMemory);
/*设置内存DC的起始点*/
dcMemory.SetViewportOrg(-1*rectClip.left, -1*rectClip.top);
/*粉刷背景*/
dcMemory.FillSolidRect(&rectClip, pDC->GetBkColor());
DrawDirect(&dcMemory);
/*把内存DC复制到输入DC中*/
pDC->BitBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(),
&dcMemory, rectClip.left, rectClip.top, SRCCOPY);
/*释放资源*/
bmpMemory.DeleteObject();
dcMemory.DeleteDC();
}
5、工程源代码下载
http://files.cnblogs.com/xianyunhe/DoubleBuffer.rar
摘自 http://www.cnblogs.com/xianyunhe/archive/2011/11/20/2255811.html