Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

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

0.00/5 (No votes)
21 Feb 2005 1  
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