Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

CFileDialog functionality on a PropertyPage

Posted on 1999-07-07
16
Medium Priority
?
823 Views
Last Modified: 2013-11-20

 
 
There are a number of examples showing how to customize the CFileDialog class.  Does anyone know how to add a file picker (a tree like explorer) to a Property Page?
On my property page I want to add a tree control that behaves just like windows explorer. I want to browse directories for files I designate programatically and allow the user to select and multiselect files in the tree.
0
Comment
Question by:EWaszkow
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
16 Comments
 
LVL 2

Expert Comment

by:The Master
ID: 1309171
0
 

Expert Comment

by:f4817
ID: 1309172
hi,

you can overide a CTreeCtrl control and use the Com of Explore (SH function)
0
 
LVL 1

Accepted Solution

by:
Buddah1 earned 2000 total points
ID: 1309173
a cool way of doing this is by first creating a dialog, just a normal CDialog class.  Drop a static text field in the dialog and make it invisible.  make the resource ID to 1119.  what this does it that it creates a dialog, and where you have that static dialog it places the CFileDialog.  you can modify that by GetParent()->GetDlgItem(control name).  in the class definition and implementations files, make sure you're inheriting from CFileDialog instead of CDialog

Now to add the list view... look at the following code:
Sorry for the messy output, i just copied from my DevStudio to here...
(header file)
// DriveTreeView.h : interface of the CDriveView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_DRIVETREEVIEW_H__090B382D_959D_11D2_8E53_006008A82731__INCLUDED_)
#define AFX_DRIVETREEVIEW_H__090B382D_959D_11D2_8E53_006008A82731__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


class CDriveView : public CTreeView
{
protected: // create from serialization only
      CDriveView();
      DECLARE_DYNCREATE(CDriveView)

// Attributes
public:
      CDriveTreeDoc* GetDocument();

// Operations
public:

// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CDriveView)
      public:
      virtual void OnDraw(CDC* pDC);  // overridden to draw this view
      virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
      protected:
      virtual void OnInitialUpdate(); // called first time after construct
      //}}AFX_VIRTUAL

// Implementation
public:
      virtual ~CDriveView();
#ifdef _DEBUG
      virtual void AssertValid() const;
      virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
      BOOL AddDriveItem (LPCTSTR pszDrive);
      int AddDirectories (HTREEITEM hItem, LPCTSTR pszPath);
      void DeleteAllChildren (HTREEITEM hItem);
      void DeleteFirstChild (HTREEITEM hItem);
      CString GetPathFromItem (HTREEITEM hItem);
      BOOL SetButtonState (HTREEITEM hItem, LPCTSTR pszPath);
      int AddDrives ();
      CImageList m_ilDrives;
      //{{AFX_MSG(CDriveView)
      afx_msg void OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult);
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG  // debug version in DriveTreeView.cpp
inline CDriveTreeDoc* CDriveView::GetDocument()
   { return (CDriveTreeDoc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DRIVETREEVIEW_H__090B382D_959D_11D2_8E53_006008A82731__INCLUDED_)

//
//(source file)
//
// DriveTreeView.cpp : implementation of the CDriveView class
//

#include "stdafx.h"
#include "DriveTree.h"

#include "DriveTreeDoc.h"
#include "DriveView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// Image indexes
#define ILI_HARD_DISK       0
#define ILI_FLOPPY          1
#define ILI_CD_ROM          2
#define ILI_NET_DRIVE       3
#define ILI_CLOSED_FOLDER   4
#define ILI_OPEN_FOLDER     5

/////////////////////////////////////////////////////////////////////////////
// CDriveView

IMPLEMENT_DYNCREATE(CDriveView, CTreeView)

BEGIN_MESSAGE_MAP(CDriveView, CTreeView)
      //{{AFX_MSG_MAP(CDriveView)
      ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemExpanding)
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDriveView construction/destruction

CDriveView::CDriveView()
{
}

CDriveView::~CDriveView()
{
}

BOOL CDriveView::PreCreateWindow(CREATESTRUCT& cs)
{
      if (!CTreeView::PreCreateWindow (cs))
            return FALSE;

    cs.style |= TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS |
        TVS_SHOWSELALWAYS;
      return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CDriveView drawing

void CDriveView::OnDraw(CDC* pDC)
{
      CDriveTreeDoc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
      // TODO: add draw code for native data here
}

void CDriveView::OnInitialUpdate()
{
      CTreeView::OnInitialUpdate();

      //
      // Initialize the image list.
      //
    m_ilDrives.Create (IDB_DRIVEIMAGES, 16, 1, RGB (255, 0, 255));
    GetTreeCtrl ().SetImageList (&m_ilDrives, TVSIL_NORMAL);

      //
      // Populate the tree view with drive items.
      //
    AddDrives ();

      //
      // Show the folders on the current drive.
      //
      TCHAR szPath[MAX_PATH];
      ::GetCurrentDirectory (sizeof (szPath) / sizeof (TCHAR), szPath);
      CString strPath = szPath;
      strPath = strPath.Left (3);

      HTREEITEM hItem = GetTreeCtrl ().GetNextItem (NULL, TVGN_ROOT);
      while (hItem != NULL) {
            if (GetTreeCtrl ().GetItemText (hItem) == strPath)
                  break;
            hItem = GetTreeCtrl ().GetNextSiblingItem (hItem);
      }

      if (hItem != NULL) {
            GetTreeCtrl ().Expand (hItem, TVE_EXPAND);
            GetTreeCtrl ().Select (hItem, TVGN_CARET);
      }
}

/////////////////////////////////////////////////////////////////////////////
// CDriveView diagnostics

#ifdef _DEBUG
void CDriveView::AssertValid() const
{
      CTreeView::AssertValid();
}

void CDriveView::Dump(CDumpContext& dc) const
{
      CTreeView::Dump(dc);
}

CDriveTreeDoc* CDriveView::GetDocument() // non-debug version is inline
{
      ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDriveTreeDoc)));
      return (CDriveTreeDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDriveView message handlers

int CDriveView::AddDrives()
{
    int nPos = 0;
    int nDrivesAdded = 0;
    CString string = _T ("?:\\");

    DWORD dwDriveList = ::GetLogicalDrives ();

    while (dwDriveList) {
        if (dwDriveList & 1) {
            string.SetAt (0, _T ('A') + nPos);
            if (AddDriveItem (string))
                nDrivesAdded++;
        }
        dwDriveList >>= 1;
        nPos++;
    }
    return nDrivesAdded;
}

BOOL CDriveView::AddDriveItem(LPCTSTR pszDrive)
{
    CString string;
    HTREEITEM hItem;

    UINT nType = ::GetDriveType (pszDrive);

    switch (nType) {

    case DRIVE_REMOVABLE:
        hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_FLOPPY,
            ILI_FLOPPY);
        GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
            ILI_CLOSED_FOLDER, hItem);
        break;

    case DRIVE_FIXED:
    case DRIVE_RAMDISK:
        hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_HARD_DISK,
            ILI_HARD_DISK);
        SetButtonState (hItem, pszDrive);
        break;

    case DRIVE_REMOTE:
        hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_NET_DRIVE,
            ILI_NET_DRIVE);
        SetButtonState (hItem, pszDrive);
        break;

    case DRIVE_CDROM:
        hItem = GetTreeCtrl ().InsertItem (pszDrive, ILI_CD_ROM,
            ILI_CD_ROM);
        GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
            ILI_CLOSED_FOLDER, hItem);
        break;

    default:
        return FALSE;
    }
    return TRUE;
}

BOOL CDriveView::SetButtonState(HTREEITEM hItem, LPCTSTR pszPath)
{
    HANDLE hFind;
    WIN32_FIND_DATA fd;
    BOOL bResult = FALSE;

    CString strPath = pszPath;
    if (strPath.Right (1) != _T ("\\"))
        strPath += _T ("\\");
    strPath += _T ("*.*");

    if ((hFind = ::FindFirstFile (strPath, &fd)) == INVALID_HANDLE_VALUE)
        return bResult;

    do {
        if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            CString strComp = (LPCTSTR) &fd.cFileName;
            if ((strComp != _T (".")) && (strComp != _T (".."))) {
                GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
                    ILI_CLOSED_FOLDER, hItem);
                bResult = TRUE;
                break;
            }
        }
    } while (::FindNextFile (hFind, &fd));

    ::FindClose (hFind);
    return bResult;
}

void CDriveView::OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
      NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    HTREEITEM hItem = pNMTreeView->itemNew.hItem;
    CString string = GetPathFromItem (hItem);

    *pResult = FALSE;

    if (pNMTreeView->action == TVE_EXPAND) {
        DeleteFirstChild (hItem);
        if (AddDirectories (hItem, string) == 0)
            *pResult = TRUE;
    }
    else { // pNMTreeView->action == TVE_COLLAPSE
        DeleteAllChildren (hItem);
        if (GetTreeCtrl ().GetParentItem (hItem) == NULL)
            GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
                ILI_CLOSED_FOLDER, hItem);
        else
            SetButtonState (hItem, string);
    }
}

CString CDriveView::GetPathFromItem(HTREEITEM hItem)
{
    CString strResult = GetTreeCtrl ().GetItemText (hItem);

    HTREEITEM hParent;
    while ((hParent = GetTreeCtrl ().GetParentItem (hItem)) != NULL) {
        CString string = GetTreeCtrl ().GetItemText (hParent);
        if (string.Right (1) != _T ("\\"))
            string += _T ("\\");
        strResult = string + strResult;
        hItem = hParent;
    }
    return strResult;
}

void CDriveView::DeleteFirstChild(HTREEITEM hItem)
{
    HTREEITEM hChildItem;
    if ((hChildItem = GetTreeCtrl ().GetChildItem (hItem)) != NULL)
        GetTreeCtrl ().DeleteItem (hChildItem);
}

void CDriveView::DeleteAllChildren(HTREEITEM hItem)
{
    HTREEITEM hChildItem;
    if ((hChildItem = GetTreeCtrl ().GetChildItem (hItem)) == NULL)
        return;

    do {
        HTREEITEM hNextItem = GetTreeCtrl ().GetNextSiblingItem (hChildItem);
        GetTreeCtrl ().DeleteItem (hChildItem);
        hChildItem = hNextItem;
    } while (hChildItem != NULL);
}

int CDriveView::AddDirectories(HTREEITEM hItem, LPCTSTR pszPath)
{
    HANDLE hFind;
    WIN32_FIND_DATA fd;
    HTREEITEM hNewItem;

    int nCount = 0;

    CString strPath = pszPath;
    if (strPath.Right (1) != _T ("\\"))
        strPath += _T ("\\");
    strPath += _T ("*.*");

    if ((hFind = ::FindFirstFile (strPath, &fd)) == INVALID_HANDLE_VALUE) {
        if (GetTreeCtrl ().GetParentItem (hItem) == NULL)
            GetTreeCtrl ().InsertItem (_T (""), ILI_CLOSED_FOLDER,
                ILI_CLOSED_FOLDER, hItem);
        return 0;
    }

    do {
        if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            CString strComp = (LPCTSTR) &fd.cFileName;
            if ((strComp != _T (".")) && (strComp != _T (".."))) {
                hNewItem =
                    GetTreeCtrl ().InsertItem ((LPCTSTR) &fd.cFileName,
                    ILI_CLOSED_FOLDER, ILI_OPEN_FOLDER, hItem);

                CString strNewPath = pszPath;
                if (strNewPath.Right (1) != _T ("\\"))
                    strNewPath += _T ("\\");

                strNewPath += (LPCTSTR) &fd.cFileName;
                SetButtonState (hNewItem, strNewPath);
                nCount++;
            }
        }
    } while (::FindNextFile (hFind, &fd));

    ::FindClose (hFind);
    return nCount;
}
 hope this helps
0
Learn how to optimize MySQL for your business need

With the increasing importance of apps & networks in both business & personal interconnections, perfor. has become one of the key metrics of successful communication. This ebook is a hands-on business-case-driven guide to understanding MySQL query parameter tuning & database perf

 

Author Comment

by:EWaszkow
ID: 1309174
Buddah,

How would this work if I want to do this on a CPropertyPage instead of a CDialog?  Does the 1119 static resource derive from this new class or does the parent window need to be a CFileDialog?  I have a CPropertyPage not a CDialog.
Can this still work?
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309175
this still works on a property page.  the 1119 derives from a new class.  just make the property page a child.
0
 

Author Comment

by:EWaszkow
ID: 1309176
Buddah1,

I have tried and tried and I don't know what I am doing wrong.
I created a new dialog project.
I added the static text and set its resourceID to 1119.
I changed properties of 1119 and unchecked the visible box.
I built the app and the dialog comes up and I see no CFileDialog.  What am I forgetting to do?
What am I supposed to derive from CFileDialog? The 1119 control? or the CFileDialog app?
If I derive the CDialog app from CFileDialog, all I get is a CFileDialog.  This is not what I want.  I want a CDialog with many controls on it, one of which is a CFileDialog.
Please help....
If you can help me out with this I'll bump this up to 500 points for you...
Thanks --- Wasz
0
 

Author Comment

by:EWaszkow
ID: 1309177
How does the CDriveView fit into all of this??
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309178
EWaszkow,

what i proposed is exactly for what you want.  I just had to do this myself for a project.  I will include some code below to show you exactly what you have to do, but first here is the idea...

Here are the steps to take...
first in your resource view, create a new dialog.  goto the properties of that dialog by right clicking and then properties. leave general as is, go to the styles tab.
Uncheck title bar, check clip siblings and children.  change style to child.

Add a static text box.  in properties do the following:
General tab:  ID = 1119
              Caption empty
Styles tab:   click sunken and border
Extended Sytles:  client edge checked...

now let class wizard create the class for you.  do this by double clicking the dialog and create new class.  In this screen keep the base class as CDialog and give it a name.  Once class is created goto the header file and make the following changes:
from:
class test : public CDialog
{
// Construction
public:
      test(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
      //{{AFX_DATA(test)
      enum { IDD = IDD };
            // NOTE: the ClassWizard will add data members here
      //}}AFX_DATA


// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(test)
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      //}}AFX_VIRTUAL

// Implementation
protected:

      // Generated message map functions
      //{{AFX_MSG(fadf)
            // NOTE: the ClassWizard will add member functions here
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};

TO:
class test : public CFileDialog
{
// Construction
public:
      test(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
      //{{AFX_DATA(test)
      enum { IDD = IDD };
            // NOTE: the ClassWizard will add data members here
      //}}AFX_DATA


// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(test)
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      //}}AFX_VIRTUAL

// Implementation
protected:

      // Generated message map functions
      //{{AFX_MSG(test)
            // NOTE: the ClassWizard will add member functions here
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};
change the cpp file from:
test::test(CWnd* pParent /*=NULL*/)
      : CDialog(fadf::IDD, pParent)
{
      //{{AFX_DATA_INIT(fadf)
            // NOTE: the ClassWizard will add member initialization here
      //}}AFX_DATA_INIT
}

TO:
test::test(CWnd* pParent /*=NULL*/)
      : CFileDialog(NULL)
{
      //{{AFX_DATA_INIT(fadf)
            // NOTE: the ClassWizard will add member initialization here
      //}}AFX_DATA_INIT
}

Now if you run this and envoke this dialog in your application, you should see a big dialog with an OK and Cancel button in the upper right.. and wherever you dropped your static text field you will see the  CFileDialog.  the 1119 maps to MFC's CFileDialog Resource.

Now you can add any control you want to on the dialog.
if you want to change anything on the cfiledialog, you can override the OnInitDialog() in your class and access items the following way...
say i want to move the File Name Text box down..  I would do this:

CWnd * pWnd = GetParent()->GetDlgItem(edt1);
CRect rect = pWnd->GetWindowRect(&rect);
GetParent()->ScreenToClient(&rect);
....
you get the idea...

If this doesn't help, send me your e-mail address and I can send you a sample project that does this...

Good Luck
Buddah
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309179
Oops.. forgot 1 major thing...
you have to make a call to SetTemplate..

do this in the class constructor

if the name of your dialog is IDD_DIALOG
you would do this:
SetTemplate(NULL, IDD_DIALOG);
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309180
Another Oops...
the constructor for your class has to be:
test::test(CWnd* pParent /*=NULL*/)
: CFileDialog(TRUE) //NULL changed to true to show open dlg
{
   SetTemplate(NULL, IDD);   //IDD enum'd to your dialog
                             //in h file
}
0
 

Author Comment

by:EWaszkow
ID: 1309181
OK...
The SetTemplate was the magic I did not have...
Now, how do I get this onto my CPropertyPage.

I have an MDI application with many Doc/View/Frames.
I want this functionality on a couple of CPropertyPages
on these Doc/View/Frames

Do I derive my CPropertyPage from CFileDialog??  How does this work?

You said that the project example you have has this on a property page.  Can you send it to me?

My E-Mail address is waszkowski_ed@keithley.com
Thanks --- Wasz
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309182
I don't have an example using property sheets, but I can make one if you want, but it is very simple and you'll be able to do it.
now that you have your dialog class made, make a new class call it CMyPropertySheet or something
give it a protected member of class type Test (where test is the name of your new CFileDialog class you built above).

This is a class header you can use:
class CMyPropertySheet : public CPropertySheet
{
      DECLARE_DYNAMIC(CMyPropertySheet)

// Construction
public:
      CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
      CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);

// Attributes
public:
      Test m_myCFileDialog;

// Operations
public:

// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CMyPropertySheet)
      //}}AFX_VIRTUAL

// Implementation
public:
      virtual ~CMyPropertySheet();

      // Generated message map functions
protected:
      //{{AFX_MSG(CMyPropertySheet)
            // NOTE - the ClassWizard will add and remove member functions here.
      //}}AFX_MSG
      afx_msg void OnApply ();
      DECLARE_MESSAGE_MAP()
};

the cpp file...
/////////////////////////////////////////////////////////////////////////////
// CMyPropertySheet

IMPLEMENT_DYNAMIC(CMyPropertySheet, CPropertySheet)

CMyPropertySheet::CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd,
      UINT iSelectPage) : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
    AddPage (&m_myCFileDialog);

}

CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd,
      UINT iSelectPage) : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
    AddPage (&m_myCFileDialog);
}

CMyPropertySheet::~CMyPropertySheet()
{
}


The Property sheets can take normal dialogs and put them together in tabbed form.  This is all you should need.
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309183
I don't have an example using property sheets, but I can make one if you want, but it is very simple and you'll be able to do it.
now that you have your dialog class made, make a new class call it CMyPropertySheet or something
give it a protected member of class type Test (where test is the name of your new CFileDialog class you built above).

This is a class header you can use:
class CMyPropertySheet : public CPropertySheet
{
      DECLARE_DYNAMIC(CMyPropertySheet)

// Construction
public:
      CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
      CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);

// Attributes
public:
      Test m_myCFileDialog;

// Operations
public:

// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CMyPropertySheet)
      //}}AFX_VIRTUAL

// Implementation
public:
      virtual ~CMyPropertySheet();

      // Generated message map functions
protected:
      //{{AFX_MSG(CMyPropertySheet)
            // NOTE - the ClassWizard will add and remove member functions here.
      //}}AFX_MSG
      afx_msg void OnApply ();
      DECLARE_MESSAGE_MAP()
};

the cpp file...
/////////////////////////////////////////////////////////////////////////////
// CMyPropertySheet

IMPLEMENT_DYNAMIC(CMyPropertySheet, CPropertySheet)

CMyPropertySheet::CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd,
      UINT iSelectPage) : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
    AddPage (&m_myCFileDialog);

}

CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd,
      UINT iSelectPage) : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
    AddPage (&m_myCFileDialog);
}

CMyPropertySheet::~CMyPropertySheet()
{
}


The Property sheets can take normal dialogs and put them together in tabbed form.  This is all you should need.
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309184
In response to
>Do I derive my CPropertyPage from CFileDialog??  How does this work?
you can inherit from both by
CMypropertySheet() : public CPropertyPage(), public CFileDialog
0
 

Author Comment

by:EWaszkow
ID: 1309185
I ended up rolling my own tree control, but I can certainly use the information you provided sometime in the future.  Thank you for you excellent help and willingness to respond quickly.  Verify that you received 500 points for this.
0
 
LVL 1

Expert Comment

by:Buddah1
ID: 1309186
Thanks for the points Wasz!
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this article, I'll describe -- and show pictures of -- some of the significant additions that have been made available to programmers in the MFC Feature Pack for Visual C++ 2008.  These same feature are in the MFC libraries that come with Visual …
If you use Adobe Reader X it is possible you can't open OLE PDF documents in the standard. The reason is the 'save box mode' in adobe reader X. Many people think the protected Mode of adobe reader x is only to stop the write access. But this fe…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In this video, Percona Director of Solution Engineering Jon Tobin discusses the function and features of Percona Server for MongoDB. How Percona can help Percona can help you determine if Percona Server for MongoDB is the right solution for …

661 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question