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

来源:互联网 发布:数据挖掘常用算法 编辑:程序博客网 时间:2024/06/02 14:41
 
转载


本文对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树型控件浏览文件目录(一)--显示文件树
0 0
原创粉丝点击