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