MFC 双缓存绘图

在SDI应用程序中,当我们需要时刻动态刷新界面的时候,如果我们一直使用,UpdateAllView()那么就会出现屏幕不停闪烁。闪屏非常严重,特别是一直在动态刷新的时候。并且在闪屏的过程中 我们根本就不能进行任何操作。那么此时我们就需要改变我们刷新的方式,只刷新我们需要刷新的那部分界面。


我们使用双缓存绘图方式就可以很好的解决这个问题。


在OnDraw()函数中:
 //------------------双缓存绘图-----------------//
 CPoint ptCenter;
 CRect rect, ellipseRect;
 GetClientRect(&rect);
 ptCenter = rect.CenterPoint();
 CDC dcMem;//定义一个现实设备对象
 CBitmap bmp;//定义一个位图对象
 //随后建立与屏幕现实兼容的内存现实设备
 dcMem.CreateCompatibleDC(pDC);
 //这是还不能绘图,因为没有地方画
 //下面建立一个与屏幕现实兼容的位图,至于位图的大小可以使用窗口大小
 //即创建兼容位图
 bmp.CreateCompatibleBitmap(&dcMem, rect.Width(), rect.Height());
 //将位图选入内存DC
 dcMem.SelectObject(&bmp);
 //按照原有背景色填充客户区
 dcMem.FillSolidRect(rect, pDC->GetBkColor());
 //绘图操作
 for( int i = 60; i > 0; --i)
 {
  ellipseRect.SetRect(ptCenter, ptCenter);
  ellipseRect.InflateRect(i*5,i*5);
  dcMem.Ellipse(ellipseRect);	//在内存上绘图
 
 }
 
 //将内存DC上的东西复制到pDC
 pDC->BitBlt(0,0, rect.Width(), rect.Height(), &dcMem, 0, 0, SRCCOPY);
 dcMem.DeleteDC();//删除DC
 bmp.DeleteObject();//删除位图

注意:在OnDraw()函数中,应该先进行双绘图的设置,然后才运行你需要更新的内容。


然后在需要刷新的位置加入:

 POSITION pos = pDoc->GetFirstViewPosition();
   CPointCloudMeasureView *pView = NULL;
   if(pos)
    pView = (CPointCloudMeasureView *)pDoc->GetNextView(pos);
   else
    ASSERT(false);
   //pView->Invalidate();
   HWND hWnd = AfxGetMainWnd()->m_hWnd;
   pView->InvalidateRect((LPCRECT)hWnd);


原文地址:https://www.cnblogs.com/skyhuangdan/p/5486784.html