Introduction
If you want to select folders and subfolders from a drive in a CTreeCtrl
, this article is for you. To use my class CFolderTreeCtrl
and retrieve the selected folders, you must use the CFolderList
class. CFolderTreeCtrl
and CFolderList
are completely free.
Using CFolderTreeCtrl
This class allows to select folders and subfolders, with three rules:
- If a folder is selected, all subfolders are selected.
- If all children of the current folder are selected, the current folder is also selected automatically.
- If the current folder contains just one or multiple selected folders or subfolders, the current folder and all parents are bolded.
How to add CFolderTreeCtrl class in your project
Step 1: Add CFolderTreeCtrl
files and icons.
Add CFolderTreeCtrl.h and CFolderTreeCtrl.cpp files in your project. Add the icons like below:
- DRIVE_CDROM.ico
- DRIVE_FIXED.ico
- DRIVE_FLOPPY.ico
- DRIVE_REMOVABLE.ico
- FOLDER_CLOSE.ico
- FOLDER_OPEN.ico
Step 2: Add CTreeCtrl
control on your dialog window.
Select CTreeCtrl
from the Controls floating toolbar, and create a bounding rectangle equal to the size of the list control you would like.
Step 3: Set the good property in your CTreeCtrl
control like below:
Step 4: Add a CTreeCtrl
instance.
Add a CTreeCtrl
instance with class wizard, call the member variable m_tree
by convention.
Step 5: Include CFolderTreeCtrl
in the DIALOG_YOURDIALOG
header (.h) file.
#include "CFolderTreeCtrl.h"
Step 6: Change CTreeCtrl
instance to CFolderTreeCtrl
in the DIALOG_YOURDIALOG
header (.h) file.
enum { IDD = IDD_DIALOG_YOURDIALOG };
CFolderTreeCtrl m_tree;
How to use CFolderTreeCtrl class in your project
Just one step: Initialize the CFolderTreeCtrl
instance m_tree
:
void DIALOG_YOURDIALOG::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE1, m_tree);
m_tree.Init();
m_tree.AddDrive("C:\\"); // or use m_tree.AddAllDrive();
}
You can also display the number of selected folders in use, m_tree.SetState
, with a pointer to a CEdit
control. To (pre-post)select a folder, use the SelectFolder
method.
Now, your CFolderTreeCtrl
is ready to use.
Using CFolderList
This class allows to retrieve selected folders from CFolderTreeCtrl
to the FolderList
, with the rule:
- If a selected folder has already a selected parent, it will not be added in the list, and added otherwise.
How to add CFolderList class in your project
Step 1: Add CFolderList
files in your project:
Add CFolderList.h and CFolderList.cpp files in your project.
Step 2: Include CFolderList
in the DIALOG_YOURDIALOG
declaration (.cpp) file.
#include "CFolderList.h"
How to use CFolderList class in your project
Step 1: Create an instance of CFolderList
.
This construction method loads in the folder list, all selected folders from the m_tree
instance of CTreeFolderCtrl
.
CFolderList::FolderList(CFolderTreeCtrl* p_tree)
GetListSize
method returns an integer. It represents the list size (the number of selected folders in the list).
int FolderList::GetListSize()
GetFolderPathName
method returns a pointer of the folder string path at the position index
. Returns NULL
if the index is out of range.
char* FolderList::GetFolderPathName(int index)
AddFolderFromTree
loads the selected folder from a CFolderTreeList
in the current list.
void FolderList::AddFolderFromTree(CFolderTreeCtrl* p_tree)
AddFolderFromTree
loads the selected item/folder from the current list in the CFolderTreeList
.
void FolderList::AddFolderInTree(CFolderTreeCtrl* p_tree)
SaveListInFile
saves the list folder in an INI file (returns 0 if an error has been detected).
int FolderList::SaveListInFile(char filePathName[])
LoadListInFile
loads list folder from an INI file to the current fodlerList
(returns 0 if an error has been detected).
int FolderList::LoadListFromFile(char filePathName[])
Update
- 02/18/05
- CheckBox button style XP.
- Drive name displayed has root of the
treectrl
.
- Some optimisations and simplifications for the source code.
- 01/02/05
- You can save and load selected folder between
CFolderList
<=> INI File and CFolderTreeCtrl
<=> CFolderList
.
- A right click button can display a context menu. It can open the selected folder and display all children selected.
- 12/29/04
- Optimisation: Decreased (again) the complexity for count of selected folder(s).
CFolderTreeCtrl
can select a folder without clicking on checkbox, with SelectFolder(char folderPathName[])
.
- If a folder is created after the display of the
CFolderTreeCtrl
, it will be auto-updated in the tree.
- 11/08/04
- Optimisation: Decreased the complexity for count of selected folder(s).
- 11/03/04
- Now you can auto-display the number of selected folder(s).
- Some optimisations for the architecture's class (no need to create event).