void CxxxDlg::TreeVisit(CTreeCtrl& tree, HTREEITEM hItem)
{
AfxMessageBox(tree.GetItemText(hItem));
if (tree.ItemHasChildren(hItem))
{//有子项
HTREEITEM hChildItem = tree.GetChildItem(hItem);
while(hChildItem != NULL)
{
TreeVisit(tree, hChildItem); //递归遍历子节点
hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT);
}
}
else//关键是这里这个else里面怎么写
{//没有子项
HTREEITEM hRootItem = tree.GetNextSiblingItem(hItem); if (hRootItem != NULL)
{
TreeVisit(tree, hRootItem); //递归遍历根节点
hRootItem = tree.GetNextItem(hRootItem, TVGN_NEXT);
}
}
} 上面的代码,如果树结点都是根结点,如下:
根1
根2
根3那么可以输出“根1” “根2” “根3”但如果树是下面的形式,有三个根,第一个根下有两个子结点。
根1
--子1
--子2
根2
根3那么就只能输出“根1” “子1” “子2” ,而“根2”和“根3”无法遍历输出。==============求高手改错,帮忙改下上面的代码,使其可以遍历所有的树的结点。
{
AfxMessageBox(tree.GetItemText(hItem));
if (tree.ItemHasChildren(hItem))
{//有子项
HTREEITEM hChildItem = tree.GetChildItem(hItem);
while(hChildItem != NULL)
{
TreeVisit(tree, hChildItem); //递归遍历子节点
hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT);
}
}
else//关键是这里这个else里面怎么写
{//没有子项
HTREEITEM hRootItem = tree.GetNextSiblingItem(hItem); if (hRootItem != NULL)
{
TreeVisit(tree, hRootItem); //递归遍历根节点
hRootItem = tree.GetNextItem(hRootItem, TVGN_NEXT);
}
}
} 上面的代码,如果树结点都是根结点,如下:
根1
根2
根3那么可以输出“根1” “根2” “根3”但如果树是下面的形式,有三个根,第一个根下有两个子结点。
根1
--子1
--子2
根2
根3那么就只能输出“根1” “子1” “子2” ,而“根2”和“根3”无法遍历输出。==============求高手改错,帮忙改下上面的代码,使其可以遍历所有的树的结点。
{
CCeFileFind find;//CCeFileFind 为自绘类,需要的话可以联系我
CString szDir = strDir;
HTREEITEM hSubItem;
if(szDir.Right(1) != "\\")
{
szDir += "\\";
}
szDir += "*.*";
BOOL res = find.FindFile(szDir);
while(res )
{
res = find.FindNextFile();
if(find.IsDirectory() && !find.IsDots())
{
CString strPath = find.GetFilePath();
CString strTitle = find.GetFileName();
hSubItem =TreeLocalFile.InsertItem( strTitle,1,1,parent );
BrowseLocalDir(strPath, hSubItem );
}
else if(!find.IsDirectory() && !find.IsDots())
{
CString strTitle = find.GetFileName();
HTREEITEM hh = TreeLocalFile.InsertItem( strTitle, 0,0,parent );
}
}
find.Close();
}