首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CTreeCtrl怎么遍历所有结点?求改遍历代码

2013-03-22 
CTreeCtrl如何遍历所有结点???求改遍历代码。void CxxxDlg::TreeVisit(CTreeCtrl& tree, HTREEITEM hItem)

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




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

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

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


[解决办法]
// 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); 

}

 


[解决办法]
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();
}
[解决办法]
代码还得自己写的,给你个思路
获取树的根节点  然后找兄弟项,这样就能把第一层节点读完。当你在读取节点的时候需要判断一下其下是否有子节点,有就循环递归读取。
切记:使用节点判断是否有效

热点排行