Click here to Skip to main content
16,016,669 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 292.5K   8K   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

 
Generalnice code.... but... Pin
Park Chunsoo18-Aug-09 1:45
Park Chunsoo18-Aug-09 1:45 
GeneralWorking on KeyDown Function Pin
Le@rner12-Aug-08 1:16
Le@rner12-Aug-08 1:16 
QuestionNew Version?? Pin
sunrisemxx14-Oct-07 21:49
sunrisemxx14-Oct-07 21:49 
QuestionRight Icons?! ---> .AddAllDrive() Pin
rootdial22-Aug-07 8:41
rootdial22-Aug-07 8:41 
AnswerRe: Right Icons?! ---&gt; .AddAllDrive() Pin
jhwurmbach14-Jul-08 4:00
jhwurmbach14-Jul-08 4:00 
QuestionHow to get tree selection? Pin
[ fade ]3-Nov-06 12:15
[ fade ]3-Nov-06 12:15 
QuestionCan you help me ! Pin
Nguyen Huu Thai17-Aug-06 18:29
Nguyen Huu Thai17-Aug-06 18:29 
QuestionTrouble accessing third level from root Pin
NickConnors19-Jun-06 13:09
NickConnors19-Jun-06 13:09 
GeneralIsValidFolder Pin
Lars Wilke24-Apr-06 15:01
Lars Wilke24-Apr-06 15:01 
GeneralKeyboard input Pin
Espen Østrem2-Jan-06 22:47
Espen Østrem2-Jan-06 22:47 
GeneralRe: Keyboard input Pin
Thomas Lerman21-Feb-06 3:41
Thomas Lerman21-Feb-06 3:41 
QuestionHow-to Select files? Pin
roxenhall10-Nov-05 21:48
roxenhall10-Nov-05 21:48 
GeneralMemory leak Pin
RolfBe14-Jul-05 3:36
RolfBe14-Jul-05 3:36 
GeneralRe: Memory leak Pin
Lars [Large] Werner31-Jan-06 5:44
professionalLars [Large] Werner31-Jan-06 5:44 
NewsRe: Memory leak - corrected fix code Pin
Douglas R. Keesler29-Dec-07 13:10
Douglas R. Keesler29-Dec-07 13:10 
GeneralRe: Memory leak - corrected fix code Pin
golocy9-Apr-09 0:27
golocy9-Apr-09 0:27 
//and in CFolderList::GetFolderPathName

Do what want to do,Go where want to go ,nothing is impossible!

GeneralRe: Memory leak Pin
lbtianya16-Nov-13 4:10
lbtianya16-Nov-13 4:10 
QuestionHow we disable tree item Pin
Evan Lin27-Jun-05 22:19
Evan Lin27-Jun-05 22:19 
QuestionWorking on .Net 2003? Pin
Jeff Sidlosky4-May-05 12:36
Jeff Sidlosky4-May-05 12:36 
AnswerRe: Working on .Net 2003? Pin
Jeff Sidlosky9-May-05 12:26
Jeff Sidlosky9-May-05 12:26 
GeneralRe: Working on .Net 2003?/2005 [modified] Pin
Tim Stubbs20-Feb-08 22:04
Tim Stubbs20-Feb-08 22:04 
QuestionCan't select parent alone... bad behavior? Pin
Jeff Sidlosky4-May-05 12:16
Jeff Sidlosky4-May-05 12:16 
AnswerRe: Can't select parent alone... bad behavior? Pin
Jeff Sidlosky12-May-05 12:13
Jeff Sidlosky12-May-05 12:13 
Generalsuper,,, but... Pin
Sataron29-Apr-05 21:52
Sataron29-Apr-05 21:52 
GeneralRe: super,,, but... Pin
AdrienP3-May-05 10:42
AdrienP3-May-05 10:42 

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.