双缓冲

来源:互联网 发布:下载迅龙数据恢复软件 编辑:程序博客网 时间:2024/04/29 18:58


普通重绘双缓冲

// 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();


原创粉丝点击