普通重绘双缓冲
// pDC为已获取的屏幕DC [10/10/2011 LuiGY] CRect rcClient; GetClientRect(&rcClient); // 创建内存DC [10/10/2011 LuiGY] CDC memDC; memDC.CreateCompatibleDC(pDC); // 创建内存位图 [10/10/2011 LuiGY] CBitmap memBitmap; memBitmap.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); // 将位内存图选进内存DC中 [10/10/2011 LuiGY] CBitmap *pOldBitmap = memDC.SelectObject(&memBitmap); // 使用内存DC在内存位图绘图 [10/10/2011 LuiGY] memDC.FillSolidRect(&rcClient, RGB(255, 0, 0)); // 将内存位图上的内容复制到屏幕 [10/10/2011 LuiGY] pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY); // 资源释放 [10/10/2011 LuiGY] memDC.SelectObject(pOldBitmap); memDC.DeleteDC(); memBitmap.DeleteObject();
优化一下
// 获取无效区域 [10/10/2011 LuiGY]
CRect rcClip;
int nClip = pDC->GetClipBox(&rcClip);
if (ERROR == nClip || NULLREGION == nClip)
{
// 当获取无效区域失败或者无效区域为空时,直接返回 [10/10/2011 LuiGY]
return TRUE;
}
CRect rcClient;
GetClientRect(&rcClient);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
CBitmap *pOldBitmap = memDC.SelectObject(&memBitmap);
// 取当前绘图区域和无效区域的交集,只在交集上绘图,如果无交集,则不再重绘 [10/10/2011 LuiGY]
CRect rcInter;
if (rcInter.IntersectRect(rcClient, rcClip))
{
// 使用内存DC在内存位图绘图,注意,只在交集区域重绘 [10/10/2011 LuiGY]
memDC.FillSolidRect(&rcInter, RGB(255, 0, 0));
}
// 如果某些区域不需要重绘,例如子控件所在区域,则可以排除此区域 [10/10/2011 LuiGY]
//CRect rcSubCtrl;
//pDC->ExcludeClipRect(&rcSubCtrl);
//设置屏幕DC的绘图区域
pDC->IntersectClipRect(&rcClip);
//只会将无效区域的重绘复制到屏幕上 [10/10/2011 LuiGY]
pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
// 如果需要恢复屏幕DC的默认重绘区域 [10/10/2011 LuiGY]
//::ExtSelectClipRgn( pDC->m_hDC, NULL, RGN_COPY );
// 资源释放 [10/10/2011 LuiGY]
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
memBitmap.DeleteObject();
用双缓冲贴图片
CRect rcClient; GetClientRect(&rcClient); CDC memDC; memDC.CreateCompatibleDC(pDC); // 加载位图,为提效率,可以将bm设为成员变量 [10/10/2011 LuiGY] CBitmap bm; bm.LoadBitmap(IDB_BITMAP1); CBitmap *pOldBitmap = memDC.SelectObject(&bm); pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY); memDC.SelectObject(pOldBitmap); memDC.DeleteDC();
CRect rcClient; GetClientRect(&rcClient); CDC memDC; memDC.CreateCompatibleDC(pDC); // 加载位图,为提高效率,可以将bm设为成员变量,初始化时只加载一次即可 [10/10/2011 LuiGY] CBitmap bm; bm.LoadBitmap(IDB_BITMAP1); // 获取位图的相关信息,也建议将bmm设为成员变量,初始化时只获取一次即可 [10/10/2011 LuiGY] BITMAP bmm; bm.GetObject(sizeof(BITMAP), &bmm); CBitmap *pOldBitmap = memDC.SelectObject(&bm); pDC->StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, bmm.bmWidth, bmm.bmHeight, SRCCOPY); memDC.SelectObject(pOldBitmap); memDC.DeleteDC();