VC界面绘制双缓存(二)

2014-11-23 21:25:03 · 作者: · 浏览: 173
过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