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






4.79/5 (24投票s)
2004年11月1日
3分钟阅读

295665

7958
一篇关于如何在 CTreeCtrl 中选择文件夹和子文件夹的文章。
引言
如果您想在 CTreeCtrl
中选择驱动器中的文件夹和子文件夹,那么本文适合您。要使用我的 CFolderTreeCtrl
类并检索选定的文件夹,您必须使用 CFolderList
类。CFolderTreeCtrl
和 CFolderList
完全免费。
使用 CFolderTreeCtrl
此类允许选择文件夹和子文件夹,共有三个规则
- 如果一个文件夹被选中,则所有子文件夹都会被选中。
- 如果当前文件夹的所有子文件夹都被选中,则当前文件夹也会自动被选中。
- 如果当前文件夹包含一个或多个选定的文件夹或子文件夹,则当前文件夹及其所有父文件夹都会加粗显示。
如何将 CFolderTreeCtrl 类添加到您的项目中
第 1 步:添加 CFolderTreeCtrl
文件和图标。
将 CFolderTreeCtrl.h 和 CFolderTreeCtrl.cpp 文件添加到您的项目中。如下所示添加图标:
- DRIVE_CDROM.ico
- DRIVE_FIXED.ico
- DRIVE_FLOPPY.ico
- DRIVE_REMOVABLE.ico
- FOLDER_CLOSE.ico
- FOLDER_OPEN.ico
第 2 步:在您的对话框窗口中添加 CTreeCtrl
控件。
从“控件”浮动工具栏中选择 CTreeCtrl
,然后创建一个与您想要的列表控件大小相等的边界矩形。
第 3 步:在您的 CTreeCtrl
控件中设置正确的属性,如下所示
第 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.h 和 CFolderList.cpp 文件添加到您的项目中。
第 2 步:在 DIALOG_YOURDIALOG
声明 (.cpp) 文件中包含 CFolderList
。
#include "CFolderList.h"
如何使用 CFolderList 类
第 1 步:创建 CFolderList
的一个实例。
此构造方法会将所有选定的文件夹从 CTreeFolderCtrl
的 m_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
- XP 复选框按钮样式。
- 驱动器名称显示为
treectrl
的根目录。 - 源代码的一些优化和简化。
- 01/02/05
- 您可以在
CFolderList
<=> INI 文件和CFolderTreeCtrl
<=>CFolderList
之间保存和加载选定的文件夹。 - 右键单击按钮可以显示上下文菜单。它可以打开选定的文件夹并显示所有选定的子文件夹。
- 您可以在
- 12/29/04
- 优化:减少了(再次)计算选定文件夹数量的复杂性。
CFolderTreeCtrl
可以通过SelectFolder(char folderPathName[])
在不单击复选框的情况下选择一个文件夹。- 如果一个文件夹是在
CFolderTreeCtrl
显示后创建的,它将在树中自动更新。
- 11/08/04
- 优化:降低了计算选定文件夹数量的复杂性。
- 11/03/04
- 现在您可以自动显示选定文件夹的数量。
- 对类架构进行了一些优化(无需创建事件)。