home *** CD-ROM | disk | FTP | other *** search
- ///////////////////////////////////////////////////////////////////////////
- // DirDialog.cpp: implementation of the CDirDialog class.
- //
- //////////////////////////////////////////////////////////////////////
-
- #include "stdafx.h"
- #include "DirDialog.h"
-
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
-
- // Callback function called by SHBrowseForFolder's browse control
- // after initialization and when selection changes
- static int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
- {
- CDirDialog* pDirDialogObj = (CDirDialog*)lpData;
-
- if (uMsg == BFFM_INITIALIZED && !pDirDialogObj->m_strSelDir.IsEmpty())
- {
- ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)(pDirDialogObj->m_strSelDir));
- }
- else // uMsg == BFFM_SELCHANGED
- {
- }
-
- return 0;
- }
-
- CDirDialog::CDirDialog()
- {
- m_strTitle = "Select a folder";
- }
-
- CDirDialog::~CDirDialog()
- {
- }
-
- bool CDirDialog::DoBrowse()
- {
- LPMALLOC pMalloc;
- if( SHGetMalloc( &pMalloc ) != NOERROR )
- return false;
-
- BROWSEINFO bInfo;
- LPITEMIDLIST pidl;
- ZeroMemory( (PVOID)&bInfo, sizeof( BROWSEINFO ) );
-
- if( !m_strInitDir.IsEmpty() )
- {
- OLECHAR olePath[MAX_PATH];
- ULONG chEaten;
- ULONG dwAttributes;
- HRESULT hr;
- LPSHELLFOLDER pDesktopFolder;
- //
- // Get a pointer to the Desktop's IShellFolder interface.
- //
- if( SUCCEEDED( SHGetDesktopFolder( &pDesktopFolder ) ) )
- {
- //
- // IShellFolder::ParseDisplayName requires the file name be in Unicode.
- //
- MultiByteToWideChar(
- CP_ACP, MB_PRECOMPOSED,
- m_strInitDir.GetBuffer(MAX_PATH), -1,
- olePath, MAX_PATH );
- m_strInitDir.ReleaseBuffer( -1 );
- //
- // Convert the path to an ITEMIDLIST.
- //
- hr = pDesktopFolder->ParseDisplayName(
- NULL, NULL, olePath, &chEaten, &pidl, &dwAttributes );
- if( FAILED( hr ) )
- {
- pMalloc->Free( pidl );
- pMalloc->Release();
- return false;
- }
- bInfo.pidlRoot = pidl;
- }
- }
- bInfo.hwndOwner = NULL;
- bInfo.pszDisplayName = m_strPath.GetBuffer( MAX_PATH );
- bInfo.lpszTitle = m_strTitle;
- bInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS | BIF_EDITBOX ;
-
- bInfo.lpfn = BrowseCtrlCallback; // address of callback function
- bInfo.lParam = (LPARAM)this; // pass address of object to callback function
-
-
- if( ( pidl = ::SHBrowseForFolder( &bInfo ) ) == NULL )
- return false;
-
- m_strPath.ReleaseBuffer();
- m_iImageIndex = bInfo.iImage;
-
- if( ::SHGetPathFromIDList( pidl, m_strPath.GetBuffer( MAX_PATH ) ) == FALSE )
- {
- pMalloc->Free( pidl );
- pMalloc->Release();
- return false;
- }
-
- m_strPath.ReleaseBuffer();
-
- pMalloc->Free( pidl );
- pMalloc->Release();
-
- return true;
- }
-