提高绘图效率
2007-08-03 10:26
281 查看
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
在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
相关文章推荐
- TeeChart绘图控件 - 之三 - 提高绘图的效率
- 怎样提高GDI+的绘图效率(补充讨论)
- 提高二维矢量绘图效率
- 提高二维矢量绘图效率之一般做法
- 利用GDI+的双缓冲技术来提高绘图效率
- 利用GDI+的双缓冲技术来提高绘图效率【转】
- 无闪烁刷屏技术的实现如何提高绘图的效率
- 利用GDI+的双缓冲技术来提高绘图效率
- 绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率
- TeeChart绘图控件 - 之三 - 提高绘图的效率
- [转]怎样提高GDI+的绘图效率(补充讨论)
- TeeChart绘图控件 - 之三 - 提高绘图的效率
- 利用GDI+的双缓冲技术来提高绘图效率
- 利用GDI+的双缓冲技术来提高绘图效率(转)
- 绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率
- 利用GDI+的双缓冲技术来提高绘图效率
- 使用bitblt提高GDI+绘图的效率
- 亿图绘图 与 word文档 设置变更提高效率
- 利用GDI+的双缓冲技术来提高绘图效率
- 提高绘图效率以及避免闪屏 -- 双缓存,剪裁区