MFC树型控件浏览文件目录(一)--显示文件树

时间:2022-10-22 11:52:52
 MFC树型控件浏览文件目录(一)--显示文件树转载

本文对MFC中,用树型控件实现文件目录的浏览进行了简单的介绍。主要实现以下几个功能:1、显示文件目录树;2、对于文件,在树型控件中双击进行打开;3、树节点添加简单右键菜单。系统:windows8.1工具:Visual Studio2013


一、树型控件显示文件目录树1、首先,让我们在VS中建立一个MFC工程,就命名为"MyTree"吧,如图1-1;点击下一步,进入图1-2,在“应用程序类型”中选择“基于对话框”;这里直接点击“完成”按钮。(当然,你可以根据自己的需要进行一些其他选项的配置,这里不详述)
图1-1 新建MFC工程MFC树型控件浏览文件目录(一)--显示文件树

图1-2 选择“基于对话框”选项MFC树型控件浏览文件目录(一)--显示文件树

2、现在,把生成的对话框中的静态文本框选中删除掉,就是图1-3中的中间那个。图1-3 去掉中间的文本框MFC树型控件浏览文件目录(一)--显示文件树

3、然后我们从“工具箱”中选中Tree Control,将它添加到对话框中设置以下几个属性为true:Has Button、Has Lines、Lines At Root;其他属性为默认值。当然你都可以根据自己的想法来选择,可以实践看看效果如何~设置属性ID为:IDC_MYTREE 。设置好后如图1-4所示。图1-4添加树型控件MFC树型控件浏览文件目录(一)--显示文件树


4、选中我们的树型控件,右键->添加变量,添加一个控件变量,名为“m_MyTree”。如图1-5。完成后,你可以在MyTreeDlg.h头文件中找到它。图1-5 添加控件变量MFC树型控件浏览文件目录(一)--显示文件树

5、接下来,让我们在MyTreeDlg.h文件中添加函数ShowFile(就在声明m_MyTree下面),ShowFile主要功能就是递归浏览给定目录下的文件,并且将其显示在树型控件中,声明如下:......public:CTreeCtrl m_MyTree;void ShowFile(CString str_Dir, HTREEITEM tree_Root);......
在MyTreeDlg.cpp中添加函数实现:
//函数名称:CMyScriptDlg::BrowseFile//函数功能:遍历给定目录str_Dir下的文件夹及文件,并插入到树形控件中//输入参数:str_Dir(起始目录),tree_Root(树形控件的根节点)//输出参数:无//返回值  :无//修改人    修改时间     修改说明//sephiroth 2014-04-29   创建
void CMyTreeDlg::ShowFile(CString str_Dir, HTREEITEM tree_Root){    CFileFind FileFind;
    //临时变量,用以记录返回的树节点    HTREEITEM tree_Temp;
    //判断输入目录最后是否存在'\',不存在则补充    if (str_Dir.Right(1) != "\\")        str_Dir += "\\";    str_Dir += "*.*";    BOOL res = FileFind.FindFile(str_Dir);    while (res)    {        tree_Temp = tree_Root;        res = FileFind.FindNextFileW();        if (FileFind.IsDirectory() && !FileFind.IsDots())//目录是文件夹        {            CString strPath = FileFind.GetFilePath(); //得到路径,做为递归调用的开始            CString strTitle = FileFind.GetFileName();//得到目录名,做为树控的结点            tree_Temp = m_MyTree.InsertItem(strTitle, 0, 0, tree_Root);            ShowFile(strPath, tree_Temp);        }        else if (!FileFind.IsDirectory() && !FileFind.IsDots())//如果是文件        {            CString strPath = FileFind.GetFilePath(); //得到路径,做为递归调用的开始            CString strTitle = FileFind.GetFileName();//得到文件名,做为树控的结点            m_MyTree.InsertItem(strTitle, 0, 0, tree_Temp);        }    }    FileFind.Close();}

代码并不复杂,可以自行阅读,简单说明一下:1)这里用至了CFileFind类,具体的说明可以google或MSDN,在通过此类对象获取文件的路径或名称时,要至少调用一次FindNextFileW(),至于为什么,我也不是很清楚,不过打断点来看,只调用FindFile时,是没有文件路径或名称的属性的。2)HTREEITEM可以理解为代表一个树节点的结构,看代码它实际是指向_TREEITEM的指针,至于里面是什么,我就没有细看了,有兴趣的可以研究一下。struct _TREEITEM;typedef struct _TREEITEM *HTREEITEM;其他的就没什么了,函数很简单,就是采用递归的方式来遍历,并且插入到树中。
剩下我们需要做的就是在对话框初始化的过程中,对树型控件进行初始化。也就是在MyTreeDlg.cpp的OnInitDialog()函数中,return的前面,添加如下代码:记得在MyTreeDlg.h中声明m_TreeRoot哈,用来记录根节点。//MyTreeDlg.cpp......// TODO:  在此添加额外的初始化代码//初始化树形控件m_TreeRoot = m_MyTree.InsertItem(L"我的文件");//插入根节点ShowFile(L"E:\\test", m_TreeRoot);//以E:\\test为根目录进行遍历return TRUE;......
至此显示文件目录树就完了(如图1-6),很简单的一个例子~下次我们介绍如何在树中双击打开文件。图1-6 显示文件树MFC树型控件浏览文件目录(一)--显示文件树