贴一篇:
TreeCtrl控制的显示速度太慢:
我从CTreeCtrl继承了一个TREE控制类,重载主要是为了改写每个节点的文本.我在 OnPaint函数中写了一些代码,但这严重地影响了TREE控制的滚动速度.
A:OnPaint函数
1.可见节点,对于GetFirstVisibleItem和GetNextVisibleItem来讲,是:
a.根节点;b.父节点已展开的节点;
因此,"可见"意味着"没有被未展开的父节点隐藏".当节点滚动到客户外时,它对上述两个函数来讲仍是可见的.
2.当TREE的内容改变时,它默认只将变为可见的节点重绘.另外其它已经是可见的节点没有必要重绘,TREE只是滚动DC的位图而已.
上面的意思是不要绘制你不需要看的节点,那会导致速度降低.建议,测试节点矩形是否在客户区,使得只有需要绘制的节点才会被绘制.
void CIndentTree::OnPaint()
{
CPaintDC dc(this); // device context for painting HTREEITEM hItem = NULL; DRAWITEMSTRUCT dis;
CRect rc; // redraw only visible items with indentation
for(
hItem = GetFirstVisibleItem();
hItem; hItem = GetNextVisibleItem( hItem ) )
{
if( !GetItemRect( hItem, rc, FALSE ) )
continue; if( rc.top <= dc.m_ps.rcPaint.bottom &&
rc.bottom > dc.m_ps.rcPaint.top &&=20
rc.left <= dc.m_ps.rcPaint.right &&
rc.right > dc.m_ps.rcPaint.left )
{
dis.hwndItem = (HWND)hItem;
dis.rcItem = rc;
OnDrawItem(0, &dis, &dc);
}
}
}OnDrawItem函数
1.删掉如下代码: IMAGEINFO* pinfo = new IMAGEINFO;
...
delete pinfo;没有必要使用动态的IMAGEINFO变量,你可以将其定义为堆栈变量.
2.GetItemState和GetItemText都是使用的GetItem,因此,你只需调用一次, 就可以从节点获得你要的所有信息.
TreeCtrl控制的显示速度太慢:
我从CTreeCtrl继承了一个TREE控制类,重载主要是为了改写每个节点的文本.我在 OnPaint函数中写了一些代码,但这严重地影响了TREE控制的滚动速度.
A:OnPaint函数
1.可见节点,对于GetFirstVisibleItem和GetNextVisibleItem来讲,是:
a.根节点;b.父节点已展开的节点;
因此,"可见"意味着"没有被未展开的父节点隐藏".当节点滚动到客户外时,它对上述两个函数来讲仍是可见的.
2.当TREE的内容改变时,它默认只将变为可见的节点重绘.另外其它已经是可见的节点没有必要重绘,TREE只是滚动DC的位图而已.
上面的意思是不要绘制你不需要看的节点,那会导致速度降低.建议,测试节点矩形是否在客户区,使得只有需要绘制的节点才会被绘制.
void CIndentTree::OnPaint()
{
CPaintDC dc(this); // device context for painting HTREEITEM hItem = NULL; DRAWITEMSTRUCT dis;
CRect rc; // redraw only visible items with indentation
for(
hItem = GetFirstVisibleItem();
hItem; hItem = GetNextVisibleItem( hItem ) )
{
if( !GetItemRect( hItem, rc, FALSE ) )
continue; if( rc.top <= dc.m_ps.rcPaint.bottom &&
rc.bottom > dc.m_ps.rcPaint.top &&=20
rc.left <= dc.m_ps.rcPaint.right &&
rc.right > dc.m_ps.rcPaint.left )
{
dis.hwndItem = (HWND)hItem;
dis.rcItem = rc;
OnDrawItem(0, &dis, &dc);
}
}
}OnDrawItem函数
1.删掉如下代码: IMAGEINFO* pinfo = new IMAGEINFO;
...
delete pinfo;没有必要使用动态的IMAGEINFO变量,你可以将其定义为堆栈变量.
2.GetItemState和GetItemText都是使用的GetItem,因此,你只需调用一次, 就可以从节点获得你要的所有信息.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货