提高绘图效率

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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值