Click here to Skip to main content
15,885,546 members
Articles / Desktop Programming / MFC
Article

CFolderTreeCtrl class, or how to select folders and subfolders from a drive

Rate me:
Please Sign up or sign in to vote.
4.79/5 (29 votes)
20 Feb 20053 min read 283.5K   7.9K   74   90
An article on how to select folders and subfolders in CTreeCtrl.

CFolderTreeCtrl1.jpg (75096 octets)

CFolderTreeCtrl2.jpg (24902 octets)

CFolderTreeCtrl3.jpg (31998 octets)

CFolderTreeCtrl4.jpg (27814 octets)

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:

CFolderTreeCtrl5.jpg (14659 octets)

CFolderTreeCtrl6.jpg (14935 octets)

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.

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

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);
    //{{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();
}

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
    1. CheckBox button style XP.
    2. Drive name displayed has root of the treectrl.
    3. Some optimisations and simplifications for the source code.
  • 01/02/05
    1. You can save and load selected folder between CFolderList <=> INI File and CFolderTreeCtrl <=> CFolderList.
    2. A right click button can display a context menu. It can open the selected folder and display all children selected.
  • 12/29/04
    1. Optimisation: Decreased (again) the complexity for count of selected folder(s).
    2. CFolderTreeCtrl can select a folder without clicking on checkbox, with SelectFolder(char folderPathName[]).
    3. If a folder is created after the display of the CFolderTreeCtrl, it will be auto-updated in the tree.
  • 11/08/04
    1. Optimisation: Decreased the complexity for count of selected folder(s).
  • 11/03/04
    1. Now you can auto-display the number of selected folder(s).
    2. Some optimisations for the architecture's class (no need to create event).

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
France France
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: Use same folder icon that Explorer uses Pin
Defenestration21-Feb-05 8:10
Defenestration21-Feb-05 8:10 
GeneralRECYCLER and RECYCLED folders should not be listed Pin
Defenestration30-Jan-05 21:17
Defenestration30-Jan-05 21:17 
GeneralOne more suggestion Pin
Davide Zaccanti3-Jan-05 4:20
Davide Zaccanti3-Jan-05 4:20 
GeneralRe: One more suggestion Pin
Defenestration6-Jan-05 1:24
Defenestration6-Jan-05 1:24 
GeneralRe: One more suggestion Pin
AdrienP6-Jan-05 7:46
AdrienP6-Jan-05 7:46 
GeneralRe: One more suggestion Pin
Defenestration7-Jan-05 1:31
Defenestration7-Jan-05 1:31 
GeneralRe: One more suggestion Pin
Anonymous7-Jan-05 3:42
Anonymous7-Jan-05 3:42 
GeneralRe: One more suggestion Pin
AdrienP7-Jan-05 3:44
AdrienP7-Jan-05 3:44 
GeneralRe: One more suggestion Pin
Defenestration7-Jan-05 18:44
Defenestration7-Jan-05 18:44 
GeneralSpelling mistakes on your website Pin
Defenestration9-Jan-05 6:11
Defenestration9-Jan-05 6:11 
QuestionSave and restore? Pin
StringCheese30-Dec-04 17:15
StringCheese30-Dec-04 17:15 
AnswerRe: Save and restore? Pin
AdrienP1-Jan-05 23:24
AdrienP1-Jan-05 23:24 
GeneralJust a thought... Pin
NGS 54967230-Dec-04 5:06
NGS 54967230-Dec-04 5:06 
GeneralRe: Just a thought... Pin
AdrienP1-Jan-05 23:27
AdrienP1-Jan-05 23:27 
GeneralRe: Just a thought... Pin
StringCheese3-Jan-05 0:38
StringCheese3-Jan-05 0:38 
GeneralPreselect folder Pin
cochondinde27-Dec-04 9:59
cochondinde27-Dec-04 9:59 
GeneralRe: Preselect folder Pin
AdrienP27-Dec-04 23:56
AdrienP27-Dec-04 23:56 
GeneralRe: Preselect folder Pin
29-Dec-04 13:05
suss29-Dec-04 13:05 
GeneralRe: Preselect folder Pin
AdrienP2-Jan-05 21:11
AdrienP2-Jan-05 21:11 
GeneralVery helpful class Pin
FredParcells16-Nov-04 5:27
FredParcells16-Nov-04 5:27 
GeneralRe: Very helpful class Pin
AdrienP16-Nov-04 9:53
AdrienP16-Nov-04 9:53 
Generalbongour Pin
john from canada10-Nov-04 8:23
sussjohn from canada10-Nov-04 8:23 
GeneralRe: bongour Pin
AdrienP10-Nov-04 11:24
AdrienP10-Nov-04 11:24 
GeneralBon boulot Pin
Pierre Couderc9-Nov-04 19:49
Pierre Couderc9-Nov-04 19:49 
GeneralRe: Bon boulot Pin
azeazeqsdqsd9-Nov-04 21:22
azeazeqsdqsd9-Nov-04 21:22 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.