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


發佈了32 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章