读书人

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

发布时间: 2013-03-22 09:49:50 作者: rapoo

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

读书人网 >VC/MFC

热点推荐