提问:treeview 遍历指定路径的目录树

时间:2022-07-07 18:01:18
本来这里有个函数了,书上给的,可是用的时候老出问题:代码
void buildtree(CString strpath,HTREEITEM hi,CTreeCtrl &htree)
{
CFileFind ff;
CString strfile,strdir;
BOOL findit;
HTREEITEM hcuritem;
CString strw(strpath);
strw+=_T("\\*.*");
findit=ff.FindFile(strw);
while (findit)
{
findit=ff.FindNextFile();
if (ff.IsDirectory()&&!ff.IsDots())
{
strdir=ff.GetFilePath();
strfile=ff.GetFileTitle();
hcuritem = htree.InsertItem(strfile,hitem);
buildtree(strdir,hcuritem,htree);
}
}
}
// CTreeViewDlg message handlers

BOOL CTreeViewDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

TCHAR path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
buildtree(path,NULL,m_mytree2);

这个不会出错,但也什么都没有m_mytree2,所以请高手来看看,错误在哪里,谢谢
高手顺路给个TreeCtrl使用的Demo吧,小弟vc新人,谢谢

4 个解决方案

#1


给你我封装的2个函数
HTREEITEM SearchText(HTREEITEM hRoot,LPWSTR RootText) //查找指定 root 下的itemtext
{
//如果hRoot = NULL,指定hRoot为Tree的根
if (hRoot == NULL)
{

hRoot = GetRootItem();
 
return NULL;
}
 //如果hRoot = NULL,返回NULL
  

 //判断hRoot是否符合条件,如果符合,返回hRoot
if (GetItemText(hRoot).Compare(RootText) == 0)
{
return hRoot;
}
 //如果hRoot没有子节点,返回NULL
if (ItemHasChildren(hRoot) == FALSE)
{
return NULL;
}
 //递归查找hRoot的所有子节点
 HTREEITEM hRes = NULL;
 HTREEITEM hItem = GetChildItem(hRoot);
 
 while (hItem)
 {

hRes = SearchText(hItem, RootText); //查以hItem为根的枝

if (hRes != NULL)     //如果在以hItem为根的枝里找到,返回结果
{
return hRes;
}  
else        //否则,查找与hItem同级的下一个枝
{
hItem = GetNextSiblingItem(hItem);
}
 } // end of while(hItem != NULL, has next item)
  
 return NULL; 

}
HTREEITEM SearchRoot(HTREEITEM hRoot,LPWSTR RootText) //查找 整个tree下的itemtext  第一个参数填入根节点
{

HTREEITEM hItemB;
HTREEITEM hItemA = GetNextItem(hRoot,TVGN_NEXT);
if(this->SearchText(hRoot,RootText)==NULL && hItemA !=NULL)
{
while(hItemA)
{

hItemB=this->SearchText(hItemA,RootText);
if(hItemB != NULL)
{
return hItemB;
}
else       
{
hItemA = SearchRoot(hItemA,RootText);
//return 0;
}
}
}
else
{
hItemB=this->SearchText(hRoot,RootText);
return hItemB;

}
return 0;
}

#2


给个Email我给你发个例子吧

#3


huangjacky@163.com
 3q u 2!

#4


不好意思,昨天在家里没有,那个例子在公司,我已经发了,注意查收哦!

#1


给你我封装的2个函数
HTREEITEM SearchText(HTREEITEM hRoot,LPWSTR RootText) //查找指定 root 下的itemtext
{
//如果hRoot = NULL,指定hRoot为Tree的根
if (hRoot == NULL)
{

hRoot = GetRootItem();
 
return NULL;
}
 //如果hRoot = NULL,返回NULL
  

 //判断hRoot是否符合条件,如果符合,返回hRoot
if (GetItemText(hRoot).Compare(RootText) == 0)
{
return hRoot;
}
 //如果hRoot没有子节点,返回NULL
if (ItemHasChildren(hRoot) == FALSE)
{
return NULL;
}
 //递归查找hRoot的所有子节点
 HTREEITEM hRes = NULL;
 HTREEITEM hItem = GetChildItem(hRoot);
 
 while (hItem)
 {

hRes = SearchText(hItem, RootText); //查以hItem为根的枝

if (hRes != NULL)     //如果在以hItem为根的枝里找到,返回结果
{
return hRes;
}  
else        //否则,查找与hItem同级的下一个枝
{
hItem = GetNextSiblingItem(hItem);
}
 } // end of while(hItem != NULL, has next item)
  
 return NULL; 

}
HTREEITEM SearchRoot(HTREEITEM hRoot,LPWSTR RootText) //查找 整个tree下的itemtext  第一个参数填入根节点
{

HTREEITEM hItemB;
HTREEITEM hItemA = GetNextItem(hRoot,TVGN_NEXT);
if(this->SearchText(hRoot,RootText)==NULL && hItemA !=NULL)
{
while(hItemA)
{

hItemB=this->SearchText(hItemA,RootText);
if(hItemB != NULL)
{
return hItemB;
}
else       
{
hItemA = SearchRoot(hItemA,RootText);
//return 0;
}
}
}
else
{
hItemB=this->SearchText(hRoot,RootText);
return hItemB;

}
return 0;
}

#2


给个Email我给你发个例子吧

#3


huangjacky@163.com
 3q u 2!

#4


不好意思,昨天在家里没有,那个例子在公司,我已经发了,注意查收哦!