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