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