CDirTreeCtrl for displaying or selecting Folders and Files

Environment: Visual C++ 6.0 SP3

This DirTreeCtrl allows a user to display folders and Filenames(optional).
The control uses the system image list for displaying the icons for the items in
the DirTreeCtrl.

You must not manage the Icon-Resources int the ImageList. The items sorted first by
foldernames and then (if selected) by filenames.

  • You can obtain the the full PathName of an Item.
  • You can set a start path before displaying the TreeItems.
  • You can select a subpath.
  • How to use this control:

    Use it in a Dialog:

    To use the control in a Dialog do the following steps:

  • Create a CTreeCtrl in your Dialog resource.

  • Define a member variable for the CDirTreeCtrl in the Dialog header file.
  • CDirTreeCtrl m_DirTree;
    

    Insert the Following Code in your OnInitDialog function:

    BOOL CTreeDialog::OnInitDialog() 
    {
     CDialog::OnInitDialog();
     TCHAR  szWorkDir[MAX_PATH];
        
     // TODO: Add extra initialization here
     // Here we subclass our CDirTreeCtrl
     if ( !m_TreeCtrl.m_hWnd )
     {
      if ( m_TreeCtrl.SubclassDlgItem( IDC_TREE1, this ) )
      {           
       m_TreeCtrl.DisplayTree( NULL /*Display all*/, 
                               TRUE /* TRUE = Display Files*/ );
    
       _getcwd( szWorkDir, 256 );
       // set the Path to the current Work-Directory
       m_TreeCtrl.SetSelPath( szWorkDir );
      }
     }
        
     return TRUE; // return TRUE unless you set the focus to a control
     // EXCEPTION: OCX Property Pages should return FALSE
    }
    

    Using the CDirTreeCtrl in a CView

    To use this control in a CView class do the following steps:
    • Define a CTreeCtrl member in your CView header file.
    • Define a ID_TREECTRL identifier in your CView header file.
    • In the class wizard implement the create function for the CView class.
    • Modify the CView::Create function listed below
    • In the class wizard implement the WM_SIZE function.
    • Modify the CView::OnSize function listed below.
    BOOL CLeftView::Create(LPCTSTR lpszClassName, 
                           LPCTSTR lpszWindowName, 
                           DWORD dwStyle, 
                           const RECT& rect, 
                           CWnd* pParentWnd, 
                           UINT nID, 
                           CCreateContext* pContext) 
    {
     // TODO: Add your specialized code here and/or call the base class
        
     BOOL  bRet;
    
     bRet = CWnd::Create(lpszClassName, 
                         lpszWindowName, 
                         dwStyle, 
                         rect, 
                         pParentWnd, 
                         nID, 
                         pContext);
    
     // this part creates the TreeCtrl and use the CLeftView
     // as his parent Window
        
     if ( m_DirTree.m_hWnd == NULL && bRet )
     {
      bRet = m_DirTree.Create(WS_CHILD | TVS_LINESATROOT | 
                              TVS_HASBUTTONS | WS_VISIBLE | 
                              TVS_HASLINES, 
                              CRect(0, 0, 0, 0), 
                              this
                              ID_TREECTRL );
      if ( bRet )
       m_DirTree.DisplayTree( NULL, TRUE );
     }
    
     return bRet;
    }
    
    void CLeftView::OnSize(UINT nType, int cx, int cy) 
    {
     CView::OnSize(nType, cx, cy);
    
     // TODO: Add your message handler code here
     if ( m_DirTree.m_hWnd )
      m_DirTree.SetWindowPos( NULL, 0, 0, cx, cy, SWP_NOZORDER | SWP_NOMOVE );
    }
    

    Downloads

    Download demo project - 55 Kb
    Download source - 5 Kb


    Comments

    • Thanks

      Posted by saeed on 09/21/2014 10:19am

      Hi micheal i used your code it's very usefull!!! but a problem I can't active cut,copy and paste in my visual studio 2010 please help me My time will over in 3 days later and me lose my job Please help me

      Reply
    • Professor

      Posted by Geof Price on 04/15/2014 08:48am

      Can you tell me how to expand all the items in the tree on creation of the tree?

      Reply
    • network

      Posted by overseb on 09/04/2006 11:52am

      Is it possible to see the directories which are on a network ? How to do this ? thx

      Reply
    • Comment

      Posted by redhat on 09/14/2005 07:25am

      Hi Michael!  I find your article very useful especially on my search using tree view control.  Could you provide me some help on tree view control displaying or selecting data from a database?  Thank you.

      Reply
    • The code do not work to me, why?

      Posted by twisterh on 07/12/2005 11:53pm

      I downloaded the entire project and rebuilt it. Got nothing both CView as well as Dialog box as I executed it. I did it with XP and VC++ 6.0. Can anyone help me out?

      Reply
    • Forward slashes killing your root

      Posted by Legacy on 10/08/2003 12:00am

      Originally posted by: LuckY

      When calling DisplayTree() with a path as the first
      
      argument, if there are any forward slashes (/) instead of
      backslashes (\) the tree will be dead. It took me a while
      to figure out that this was my problem. So I just added
      the line below to replace forwards with backslashes. The
      problem, if you're curious is that the tree showed only
      the subdirectories of the path I was passing and I couldn't
      expand them.

      In the DisplayTree() function, insert the indicated line:
      {
      m_strRoot = strRoot;

      m_strRoot.Replace('/', '\\');// <-- ADD THIS LINE

      if ( m_strRoot.Right(1) != '\\' )
      m_strRoot += "\\";
      HTREEITEM hParent = AddItem( TVI_ROOT, m_strRoot );
      DisplayPath( hParent, strRoot );
      }

      Reply
    • Auto-scroll to show newly expanded root subtree

      Posted by Legacy on 10/08/2003 12:00am

      Originally posted by: LuckY

      One thing that was bugging me was when I expanded the network drive at the bottom of the tree, the subtree expanded out below the bottom of the window but the view didn't change. I added the two lines in the code below to scroll the expanding root item to the top of the window.
      
      

      void CDirTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)
      {
      NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
      CString strPath;

      if ( pNMTreeView->itemNew.state & TVIS_EXPANDED )
      {
      //UINT uTest = TVIS_EXPANDEDONCE;
      ExpandItem( pNMTreeView->itemNew.hItem, TVE_EXPAND );

      // ADD these two lines
      if (GetParentItem(pNMTreeView->itemNew.hItem) == NULL)// scroll to show the
      Select(pNMTreeView->itemNew.hItem, TVGN_FIRSTVISIBLE);// newly expanded items

      // ...

      Reply
    • In Commerical Product

      Posted by Legacy on 09/27/2003 12:00am

      Originally posted by: Robert

      Can this code be freely used in a product?

      Only the core components of course, not the demo.

      ~Robert

      Reply
    • Problem: I can't subclass with just one dialog...

      Posted by Legacy on 12/15/2002 12:00am

      Originally posted by: julio

      I have tried to use this class without using the document/view framework, just using a Dialog as a main window. 
      
      I think it happens a problem in the line:

      if ( !m_TreeCtrl.m_hWnd )
      it always return false. How get I get the handle in order to subclass? is it possible

      Thanks,

      J. Gomes

      Reply
    • Can I use this code on my product?

      Posted by Legacy on 11/11/2002 12:00am

      Originally posted by: magda wurzl

      Hi,

      Is it possible to use this code on my product?

      Is there a copyright that I should include on the source code?

      Thank you,
      magda.

      Reply
    Leave a Comment
    • Your email address will not be published. All fields are required.

    Top White Papers and Webcasts

    • Today's agile organizations pose operations teams with a tremendous challenge: to deploy new releases to production immediately after development and testing is completed. To ensure that applications are deployed successfully, an automatic and transparent process is required. We refer to this process as Zero Touch Deployment™. This white paper reviews two approaches to Zero Touch Deployment--a script-based solution and a release automation platform. The article discusses how each can solve the key …

    • On-demand Event Event Date: December 18, 2014 The Internet of Things (IoT) incorporates physical devices into business processes using predictive analytics. While it relies heavily on existing Internet technologies, it differs by including physical devices, specialized protocols, physical analytics, and a unique partner network. To capture the real business value of IoT, the industry must move beyond customized projects to general patterns and platforms. Check out this webcast and join industry experts as …

    Most Popular Programming Stories

    More for Developers

    RSS Feeds