我用递归做的,请帮我看看。树节点只有几十个的时候能遍历全部,但是当节点有3000多个时,就只能遍历2000左右了。void CMyTreeCtrl::ExploreTreeItem(HTREEITEM hTreeItem)
{
CString strNode;
HTREEITEM hFirstChild = NULL; // Get the first child
hFirstChild = GetNextItem(hTreeItem, TVGN_CHILD); // Keep going until we have all of them
while(hFirstChild)
{
// get the current indention level
strNode = GetItemText(hFirstChild);
if(NULL != pTemp)
{
TRACE("Explore node = %s\n", strNode);
}

// Recusively get all of the child items
ExploreTreeItem(hFirstChild);

hFirstChild = GetNextItem(hFirstChild, TVGN_NEXT);
}
}

解决方案 »

  1.   

    void DragItem(HTREEITEM hItem)
    {
    HTREEITEM  hChild;
    while(hItem!=NULL) 
    {
             //strNode = GetItemText(hItem);
             hChild = GetChildItem(hItem);
             if(hChild != NULL)
     {
     DragItem(hChild);
     }
         hItem=GetNextItem(hItem, TVGN_NEXT);
    }
    }我们原来用得。
    试试看,如果还不行,请考虑用其他控件或方法解决!
      

  2.   

    还是不行,
    因为我的每个节点上都SetItemData了,都是指向一个new出来的内存块,所以在程序退出时要delete这些内存块。不能遍历跟这有关吗?
      

  3.   

    如果你是只找就一层的,那就简单,我觉得你哪里的while就不要用了这样查找应该是可以的,第一次带进来的是第一个树形结构的HTREEITEMvoid CMyTreeCtrl::ExploreTreeItem(HTREEITEM hTreeItem)
    {
    CString strNode; strNode = GetItemText(hTreeItem);
    if(NULL != pTemp)
    {
    TRACE("Explore node = %s\n", strNode);
    }

    hFirstChild = GetNextItem(hTreeItem, TVGN_NEXT);
    if(hFirstChild!=NULL)
    ExploreTreeItem(hFirstChild);
    }