提高繪圖效率

Invalidate();InvalidateRect();InvalidateRgn()使繪圖區無效。Invalidate()更新整個繪圖區;InvalidateRect(),InvalidateRgn()使部分繪圖區無效。

在View中:可用Invalidate();InvalidateRect();InvalidateRgn()使繪圖區無效
在DOC中:UpdateAllViews(參CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );可利用第三個參數傳遞無效區域,而由於MFC規定,此參數必須是一個Cobject指針,而CRect,CRegion不派生於CObject,所以一個可變通的方法是傳遞帶有無效區信息的CObject派生對象.
      /////////////DOC.CPP///////////////////
      CLine* line;
      ... ... ... ...
      ... ... ...  ...
      UpdateAllViews(null,0L,line);
    
     /////////////VIEW.CPP///////////////////
     void CTestView::OnUpdate(CView* psender,LPARAM lparam,CObject* pHint)
    {
        if(pHint!=null)
       {
             if(pHint->IsKindOf(RUNTIME_CLASS(CLine)))
             {
                //hint 提示有一個新的線條被加入,我們需要把該線條的外接巨型爲無效區
                CLine* pline=(CLine*)pHInt;
                CClinetDC dc(this);
                OnPrepareDC(&dc);
                CRect rect=pline->Getboundrect(); 
                dc.LPtoDP(&rect);
                InvalidateRect(&rect);
                return; 
             }
       }
      
      Invalidate(TRUE);     //不是預期的Cline,就重繪整個繪圖區吧
    }
   
    void CTestView::OnDraw(CDC* pDC)
   {
       ... ...
       ... ...
       CRect rect;
       pDC->GetClipBox(&rect);           ///得到無效區
       ///////爲了重繪的高效率,需要針對每個待繪數據與裁減區域對比
       CTypedPtrList<CObList,CLine*)& plineList=pDoc->m_lineList;
       POSITION pos=plineList.GetHeadPosition();
       while(pos)
      {
           CLine* pline=plineList.GetNext(pos);
           CRect recttemp;
           recttmp=pline->Getboundrect();
          if(recttemp.IntersectRect(&recttemp,&rect)) continue;
          pline->DrawLine(pDC);
      } 

   }

  參考: 
http://msdn2.microsoft.com/en-us/library/aa748582(VS.60).aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章