VC的CTreeCtrl类的递归使用

2016-02-19 21:04 3 1 收藏

下面图老师小编跟大家分享一个简单易学的VC的CTreeCtrl类的递归使用教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

  本文是对第20期中"遍历文件夹并建成目录树"一文的补充。

  CTreeCtrl是可是化编程中很实用的一个类,可以用于目录结构、层次结构、属性结构,尤其是在显示文件目录结构时更是应用广泛。看了第20期北京林业大学的李少杰朋友的一篇"遍历文件夹并建成目录树",觉得深有感触,初学VC时确实CTreeCtrl类很难掌握;至于对"树的遍历",也是数据结构的一个难点。李朋友的那篇文章解决了如果用CTreeCtrl显示目录结构,在他程序中,没有能够完善解决如何递归未知层数的目录的问题,(在CtreeCtrl的使用和函数的递归调用上有不足之处),我想对这个问题作一点补充。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  我的这个程序可以搜任意层目录,其输出结果如下:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  下面我谈谈怎么编写这个程序:

  首先,也是用MFC AppWizard[exe]生成一个dialog base的框架,在上面放一个Tree控件,并创建一个成员函数m_Tree来指向这个控件。

  之后,编写递归搜索函数   void AddFile( CString StrPath, HTREEITEM faItem );最后,在OnInitDialog()中调用AddFile,这样在程序已开始运行就显示Tree。

  详细的内容请参考附带的源代码。

  下面,我将着重讲讲如何编写AddFile函数。对于文件目录结构的遍历,选用递归算法是不错的。用递归方法对树进行遍历常用的有深度优先和广度优先两种搜索方法,由于我们要遍力整个树,所以选用深度优先的算法是不错的。因为在这里,深度优先和广度优先的时间复杂度一样,但是深度优先比较节省堆栈资源。以下,就是采用深度优先搜索的AddFile函数,我将在程序中作进一步说明。

// 递归搜索文件路径,采用深度优先搜索法void CFileTreeDlg::AddFile(CString StrPath, HTREEITEM faItem )
         //StrPath为传递过来的目录层次,本次函数调用中搜索的文件都是它的下一层的。
         //faItem为传递过来的Tree节点,本次函数调用中添加的Tree节点都是它的子节点。
{
   CFileFind OneFile;
   CString FName, DirName;
   BOOL BeWorking;
   HTREEITEM NewItem;  
   DirName = StrPath+"*.*";
   BeWorking = OneFile.FindFile( DirName );
   while ( BeWorking ) {     //BeWorking非零,指找了文件或目录
     //查找同级的目录
     BeWorking = OneFile.FindNextFile();
     if ( OneFile.IsDirectory() && !OneFile.IsDots() )    //如果查找的结果是目录又不是".."或"."
     {  
       //向Tree1中添加目录;
       DirName = OneFile.GetFilePath();
       FName = OneFile.GetFileTitle();
       //IDC_TREE1
       NewItem = m_Tree.InsertItem( FName, faItem );  //NewItem取得节点,其目的是为了下一层中
                   //添加节点方便,递归时把它传过去。
       //进入下一层递归调用。
       AddFile(DirName, NewItem);
     }
     //退出递归时,到了这里!!!
     if ( !OneFile.IsDirectory() && !OneFile.IsDots() )    //如果查找结果是文件
     {
       //向Tree1中添加文件
       FName = OneFile.GetFileTitle();       //注意这里用的是GetFileTitle,因为
                   //这里是添加文件。
       m_Tree.InsertItem( FName, faItem );
     }
    
   }// end of while
  
   OneFile.Close();            //记着用完CFileFild实例要关闭
} 

  以上程序在 VC6 professional + sp5 上通过,操作系统是 Win2000 professional。

来源:http://www.tulaoshi.com/n/20160219/1625184.html

延伸阅读
多次枚举: 实例1 口袋中有5只红球,4只白球。随机从口袋中取出3个球,取出1个红球2个白球的概率 代码如下: SPAN style="FONT-SIZE: 18px" srand( (unsigned)time( NULL ) );  int n = 0;  for(int i=0; i100000; i++)  {   char x[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};//5个红球用5个1表示 4个白球用4个2表...
串行通讯是目前计算机、通信和控制领域最基本的通信方式。在CSDN的“嵌入式开发/WINCE”社区中,经常有人提问该到哪找串口通讯类,其实这个问题我自己也问过。:)而一般的回答是给你提供一个Pocket PC 2002的SDK例子程序。但到底SDK的程序和MFC的结构有很大的不同,对于想用MFC编写通信程序的人来说也不是很便利。 另一方面,由于W...
标签: 电脑入门
注意事项:vc2010使用必须新建一工程,否则不能调试运行! 1.打开vc2010点击新建工程 2.选择win32控制台输入工程名这个随便写如lab等 3.点击下一步 4.把空工程那栏打钩就行了 5.工程建好了然后就可以往工程里添加文件了 6.下面是调试运行点击debug也可以直接用快捷键f5调试ctrl+f5是运行。 有些同学的可能在单击debug...
basic_string类的用途 basic_string并不象它的名字那样,只可能是一个字符串。有时候,它不那么象字符串。例如: typedef std::basic_stringdouble DoubleArray; 此时,basic_string是一个double类型的动态数组。你可能说,为什么不用vector呢?如下: typedef std::vectordouble DoubleArray; 这两者有什么不同?其实最大的不同,在于basic_...
Progress控件能让人们感受到一个应用程序执行的进度,在很多应用程序中都能用到它,但通常只支持在单任务中,在Windows98/NT中文操作系统下,在VC++6.0环境下,利用线程编制了一个非常小巧的应用程序来实现Progress控件的使用。它可以支持多线程,使用起来很方便。以下是这个应用程序的源代码: //ProgressDialog.h class CProgressD...

经验教程

227

收藏

65
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部