65.9K
CodeProject 正在变化。 阅读更多。
Home

CFolderTreeCtrl 类,或如何在驱动器中选择文件夹和子文件夹

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (24投票s)

2004年11月1日

3分钟阅读

viewsIcon

295665

downloadIcon

7958

一篇关于如何在 CTreeCtrl 中选择文件夹和子文件夹的文章。

CFolderTreeCtrl1.jpg (75096 octets)

CFolderTreeCtrl2.jpg (24902 octets)

CFolderTreeCtrl3.jpg (31998 octets)

CFolderTreeCtrl4.jpg (27814 octets)

引言

如果您想在 CTreeCtrl 中选择驱动器中的文件夹和子文件夹,那么本文适合您。要使用我的 CFolderTreeCtrl 类并检索选定的文件夹,您必须使用 CFolderList 类。CFolderTreeCtrlCFolderList 完全免费。

使用 CFolderTreeCtrl

此类允许选择文件夹和子文件夹,共有三个规则

  • 如果一个文件夹被选中,则所有子文件夹都会被选中。
  • 如果当前文件夹的所有子文件夹都被选中,则当前文件夹也会自动被选中。
  • 如果当前文件夹包含一个或多个选定的文件夹或子文件夹,则当前文件夹及其所有父文件夹都会加粗显示。

如何将 CFolderTreeCtrl 类添加到您的项目中

第 1 步:添加 CFolderTreeCtrl 文件和图标。

CFolderTreeCtrl.hCFolderTreeCtrl.cpp 文件添加到您的项目中。如下所示添加图标:

  • DRIVE_CDROM.ico
  • DRIVE_FIXED.ico
  • DRIVE_FLOPPY.ico
  • DRIVE_REMOVABLE.ico
  • FOLDER_CLOSE.ico
  • FOLDER_OPEN.ico

第 2 步:在您的对话框窗口中添加 CTreeCtrl 控件。

从“控件”浮动工具栏中选择 CTreeCtrl,然后创建一个与您想要的列表控件大小相等的边界矩形。

第 3 步:在您的 CTreeCtrl 控件中设置正确的属性,如下所示

CFolderTreeCtrl5.jpg (14659 octets)

CFolderTreeCtrl6.jpg (14935 octets)

第 4 步:添加一个 CTreeCtrl 实例。

使用类向导添加一个带有类名的 CTreeCtrl 实例,并按照约定将其成员变量命名为 m_tree

第 5 步:在 DIALOG_YOURDIALOG 头文件 (.h) 中包含 CFolderTreeCtrl

#include "CFolderTreeCtrl.h"

第 6 步:在 DIALOG_YOURDIALOG 头文件 (.h) 中将 CTreeCtrl 实例更改为 CFolderTreeCtrl

//{{AFX_DATA(DIALOG_YOURDIALOG)
    enum { IDD = IDD_DIALOG_YOURDIALOG };
    CFolderTreeCtrl m_tree;
//}}AFX_DATA

如何在您的项目中使用 CFolderTreeCtrl 类

只需一步:初始化 CFolderTreeCtrl 实例 m_tree

void DIALOG_YOURDIALOG::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(DIALOG_FOLDERTREE)
    DDX_Control(pDX, IDC_TREE1, m_tree);
    //}}AFX_DATA_MAP

    m_tree.Init();
    m_tree.AddDrive("C:\\"); // or use m_tree.AddAllDrive();
}

您还可以使用 m_tree.SetState 显示所选文件夹的数量,并提供指向 CEdit 控件的指针。要 (预先) 选择一个文件夹,请使用 SelectFolder 方法。

现在,您的 CFolderTreeCtrl 已准备就绪。

使用 CFolderList

此类允许将 CFolderTreeCtrl 中选定的文件夹检索到 FolderList,规则如下:

  • 如果一个选定的文件夹已经有一个选定的父文件夹,则它不会被添加到列表中,否则会被添加。

如何将 CFolderList 类添加到您的项目中

第 1 步:将 CFolderList 文件添加到您的项目中

CFolderList.hCFolderList.cpp 文件添加到您的项目中。

第 2 步:在 DIALOG_YOURDIALOG 声明 (.cpp) 文件中包含 CFolderList

#include "CFolderList.h"

如何使用 CFolderList 类

第 1 步:创建 CFolderList 的一个实例。

此构造方法会将所有选定的文件夹从 CTreeFolderCtrlm_tree 实例加载到文件夹列表中。

CFolderList::FolderList(CFolderTreeCtrl* p_tree)

GetListSize 方法返回一个整数。它表示列表大小(列表中选定的文件夹数量)。

int FolderList::GetListSize()

GetFolderPathName 方法在位置 index 返回文件夹字符串路径的指针。如果索引超出范围,则返回 NULL

char* FolderList::GetFolderPathName(int index)

AddFolderFromTree 将选定的文件夹从 CFolderTreeList 加载到当前列表中。

void FolderList::AddFolderFromTree(CFolderTreeCtrl* p_tree)

AddFolderFromTree 将当前列表中的选定项/文件夹加载到 CFolderTreeList 中。

void FolderList::AddFolderInTree(CFolderTreeCtrl* p_tree)

SaveListInFile 将文件夹列表保存到 INI 文件(如果检测到错误,则返回 0)。

int FolderList::SaveListInFile(char filePathName[])

LoadListInFile 将文件夹列表从 INI 文件加载到当前 fodlerList(如果检测到错误,则返回 0)。

int FolderList::LoadListFromFile(char filePathName[])

更新

  • 02/18/05
    1. XP 复选框按钮样式。
    2. 驱动器名称显示为 treectrl 的根目录。
    3. 源代码的一些优化和简化。
  • 01/02/05
    1. 您可以在 CFolderList <=> INI 文件和 CFolderTreeCtrl <=> CFolderList 之间保存和加载选定的文件夹。
    2. 右键单击按钮可以显示上下文菜单。它可以打开选定的文件夹并显示所有选定的子文件夹。
  • 12/29/04
    1. 优化:减少了(再次)计算选定文件夹数量的复杂性。
    2. CFolderTreeCtrl 可以通过 SelectFolder(char folderPathName[]) 在不单击复选框的情况下选择一个文件夹。
    3. 如果一个文件夹是在 CFolderTreeCtrl 显示后创建的,它将在树中自动更新。
  • 11/08/04
    1. 优化:降低了计算选定文件夹数量的复杂性。
  • 11/03/04
    1. 现在您可以自动显示选定文件夹的数量。
    2. 对类架构进行了一些优化(无需创建事件)。
© . All rights reserved.