普通重绘双缓冲
// 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();