void CCallStackView::InitCallStackTree()
{
int     err;
CString sOutBuf, sLine;
int     iPos = 1;
int     iSel; m_treeCtrlCallstack.DeleteAllItems(); m_treeCtrlCallstack.SetRedraw(false);
if(m_spCallStackItemList.get())
m_spCallStackItemList->clear();

try
{
err = m_mslRddata->Exchange ("bt", &sOutBuf);
while (iPos > 0)
{
iPos = sOutBuf.Find ('\n', 1);
sLine = sOutBuf.Left(iPos);
sOutBuf = sOutBuf.Mid (iPos + 1);
if (iPos > 0 && m_spCallStackItemList.get())
{
CCallStackViewItemSharedPtr  spCallStack = CCallStackViewItemSharedPtr(new CCallStackViewItem(sLine)); 
m_spCallStackItemList->push_back(spCallStack);
}
} if(m_spCallStackItemList.get())
{
CCallStackViewItemList::iterator it = m_spCallStackItemList->begin();
for( ; it != m_spCallStackItemList->end() ; it++)
{
(*it)->displayItem(m_treeCtrlCallstack,m_treeCtrlCallstack.GetRootItem());
} }

}
catch (CMemoryException* e)
{

}
catch (CFileException* e)
{
}
catch (CException* e)
{
}

for(HTREEITEM hItem = m_treeCtrlCallstack.GetRootItem() ; hItem != NULL ; hItem = m_treeCtrlCallstack.GetNextSiblingItem(hItem))
{
m_treeCtrlCallstack.Expand(hItem,TVE_EXPAND);
}
m_treeCtrlCallstack.SetRedraw(true);
return;
}
上面的函数InitCallStackTree()被一个定时器所触发,所以每次都会把树展开,关上,有没有好的办法解决这样的问题?

解决方案 »

  1.   

    试试在最开始执行LockWindowUpdate,更新完后UnlockWindowUpdate。
      

  2.   

    当数据量大的时候,出现滚动条时,用LockWindowUpdate或者SetRedraw(FALSE)等都解决不了刷新闪烁的问题。
    有一个方法我自己也没有试过,刚想出来的。就是整两个树控件,始终保持一个隐藏,一个显示,更新时更新隐藏的那一个,然后将其显示,将显示的隐藏,不知道这样会怎么样。
      

  3.   

    数据量大是什么概念,我这里数据应该不是很多,我试了下这种方法:m_treeCtrlCallstack.SetRedraw(false);
    m_treeCtrlCallstack.DeleteAllItems()

    m_treeCtrlCallstack.SetRedraw(true);
    m_treeCtrlCallstack.InvalidateRect(NULL);
    m_treeCtrlCallstack.UpdateWindow();这样 树不会闪烁了,但是还有个问题,就是每次选中一个树节点,然后又不被选中了(因为事实上树是从新生成了),请问这个问题怎么解决?