CTreeCtrl如何遍历所有结点???求改遍历代码。

bazzi2011 2013-03-13 05:09:22




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”无法遍历输出。

==============

求高手改错,帮忙改下上面的代码,使其可以遍历所有的树的结点。

...全文
220 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yht7905907 2013-03-15
  • 打赏
  • 举报
回复
代码还得自己写的,给你个思路 获取树的根节点 然后找兄弟项,这样就能把第一层节点读完。当你在读取节点的时候需要判断一下其下是否有子节点,有就循环递归读取。 切记:使用节点判断是否有效
易铭Frank 2013-03-14
  • 打赏
  • 举报
回复
void CFileManage::BrowseLocalDir( CString strDir, HTREEITEM parent )//遍历并显示系统中的各种格式的文件 { 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(); }
wqvbjhc 2013-03-13
  • 打赏
  • 举报
回复
// CTreeCtrlFind message handlers 

/* 

如果T是一棵空树,那么对T进行前序遍历、中序遍历和后序遍历都是空操作,得到的列表为空表。 

如果T是一棵单结点树,那么对T进行前序遍历、中序遍历和后序遍历都只访问这个结点。这个结点本身就是要得到的相应列表。 

否则,设它以n为树根,树根的子树从左到右依次为T1,T2,..,Tk,那么有: 

对T进行前序遍历是先访问树根n,然后依次前序遍历T1,T2,..,Tk。 

对T进行中序遍历是先中序遍历T1,然后访问树根n,接着依次对T2,T2,..,Tk进行中序遍历。 

对T进行后序遍历是先依次对T1,T2,..,Tk进行后序遍历,最后访问树根n。 

*/ 

/*************************************************************** 

* 

* 名称:FindItem 

* 

* 功能:在树控制中根据数据项名称查找数据项 

* 

* 参数:item - 要查询的数据项及其子数据项 

* 

* strText - 要查询的数据项名称 

* 

* 返回值:NULL - 没找到 

* 

* (非空的HTREEITEM ) - 找到 

* 先序遍历 

* 

***************************************************************/ 

HTREEITEM CTreeCtrlFind::PreorderFindItem(HTREEITEM item, CString strText) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

CString strTemp = GetItemText(item); 

if (GetItemText(item) == strText) //"root" node 

return item; 

if (ItemHasChildren(item)) { 

item = GetChildItem(item); //"first" tree 

while (item != NULL) { 

hFind = PreorderFindItem(item, strText); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

return NULL; 

} 

else //leaf node 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::PreorderFindItem(HTREEITEM item, DWORD dwItem) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

if (GetItemData(item) == dwItem) //"root" node 

return item; 

if (ItemHasChildren(item)) { 

item = GetChildItem(item); 

while (item != NULL) { 

hFind = PreorderFindItem(item, dwItem); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

return NULL; 

} 

else 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::Preorder2FindItem(HTREEITEM item, CString strText) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

CString strTemp = GetItemText(item); 

if (GetItemText(item) == strText) //"root" node 

return item; 

item = GetChildItem(item); //"first" tree 

while (item != NULL) { 

hFind = PreorderFindItem(item, strText); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); //"other" trees 

} 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::Preorder2FindItem(HTREEITEM item, DWORD dwItem) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

if (GetItemData(item) == dwItem) //"root" node 

return item; 

item = GetChildItem(item); //"first" tree 

while (item != NULL) { 

hFind = PreorderFindItem(item, dwItem); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); //"other" trees 

} 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::InorderFindItem(HTREEITEM item, CString strText) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

if (ItemHasChildren(item)) { 

HTREEITEM v = item; 

item = GetChildItem(item); 

hFind = InorderFindItem(item, strText); 

if (hFind) 

return hFind; 

if (GetItemText(v) == strText) 

return v; 

item = GetNextSiblingItem(item); 

while (item != NULL) { 

hFind = InorderFindItem(item, strText); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

return NULL; 

} 

else { 

if (GetItemText(item) == strText) 

return item; 

else 

return NULL; 

} 

} 

HTREEITEM CTreeCtrlFind::InorderFindItem(HTREEITEM item, DWORD dwItem) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

if (!ItemHasChildren(item)) { 

if (GetItemData(item) == dwItem) 

return item; 

else 

return NULL; 

} 

else { 

HTREEITEM v; 

v = item; 

item = GetChildItem(item); 

hFind = InorderFindItem(item, dwItem); 

if (hFind) 

return hFind; 

if (GetItemData(v) == dwItem) 

return v; 

item = GetNextSiblingItem(item); 

while (item != NULL) { 

hFind = InorderFindItem(item, dwItem); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

return NULL; 

} 

} 

HTREEITEM CTreeCtrlFind::Inorder2FindItem(HTREEITEM item, CString strText) 

{ 

HTREEITEM hFind; 

HTREEITEM v, child; 

if (!item) 

return NULL; 

v = item; 

child = GetChildItem(item); 

if (child) { 

hFind = InorderFindItem(child, strText); 

if (hFind) 

return hFind; 

} 

if (GetItemText(v) == strText) 

return v; 

if (child) { 

item = GetNextSiblingItem(child); 

while (item != NULL) { 

hFind = InorderFindItem(item, strText); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

} 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::Inorder2FindItem(HTREEITEM item, DWORD dwItem) 

{ 

HTREEITEM hFind, v, child; 

if (!item) 

return NULL; 

v = item; 

child = GetChildItem(item); 

if (child) { 

hFind = InorderFindItem(child, dwItem); 

if (hFind) 

return hFind; 

} 

if (GetItemData(v) == dwItem) 

return v; 

if (child) { 

item = GetNextSiblingItem(child); 

while (item != NULL) { 

hFind = InorderFindItem(item, dwItem); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

} 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::PostorderFindItem(HTREEITEM item, CString strText) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

if (ItemHasChildren(item)) { 

HTREEITEM v; 

v = item; 

item = GetChildItem(item); 

while (item != NULL) { 

hFind = PostorderFindItem(item, strText); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

if (GetItemText(v) == strText) 

return v; 

return NULL; 

} 

else { 

if (GetItemText(item) == strText) 

return item; 

else 

return NULL; 

} 

} 

HTREEITEM CTreeCtrlFind::PostorderFindItem(HTREEITEM item, DWORD dwItem) 

{ 

HTREEITEM hFind; 

if (!item) 

return NULL; 

if (!ItemHasChildren(item)) { 

if (GetItemData(item) == dwItem) 

return item; 

else 

return NULL; 

} 

else { 

HTREEITEM v; 

v = item; 

item = GetChildItem(item); 

while (item != NULL) { 

hFind = PostorderFindItem(item, dwItem); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

if (GetItemData(v) == dwItem) 

return v; 

return NULL; 

} 

} 

HTREEITEM CTreeCtrlFind::Postorder2FindItem(HTREEITEM item, CString strText) 

{ 

HTREEITEM hFind; 

HTREEITEM v; 

if (!item) 

return NULL; 

v = item; 

item = GetChildItem(item); 

while (item != NULL) { 

hFind = PostorderFindItem(item, strText); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

if (GetItemText(v) == strText) 

return v; 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::Postorder2FindItem(HTREEITEM item, DWORD dwItem) 

{ 

HTREEITEM hFind; 

HTREEITEM v; 

if (!item) 

return NULL; 

v = item; 

item = GetChildItem(item); 

while (item != NULL) { 

hFind = PostorderFindItem(item, dwItem); 

if (hFind) 

return hFind; 

else 

item = GetNextSiblingItem(item); 

} 

if (GetItemData(v) == dwItem) 

return v; 

return NULL; 

} 

HTREEITEM CTreeCtrlFind::FindItem(HTREEITEM item, CString strText) 

{ 

HTREEITEM v = GetNextSiblingItem(NULL); 

return Preorder2FindItem(item, strText); 

} 

HTREEITEM CTreeCtrlFind::FindItem(HTREEITEM item, DWORD dwItem) 

{ 

return PreorderFindItem(item, dwItem); 

}

 
allenhiman 2013-03-13
  • 打赏
  • 举报
回复
递归 代码自己搞吧 谢谢

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧