/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FolderDlg.h"
/////////////////////////////////////////////////////////////////////////////
#ifndef BFFM_VALIDATEFAILED
#ifndef UNICODE
#define BFFM_VALIDATEFAILED 3
#else
#define BFFM_VALIDATEFAILED 4
#endif
#endif
#ifndef BFFM_IUNKNOWN
#define BFFM_IUNKNOWN 5
#endif
/////////////////////////////////////////////////////////////////////////////
// CFolderDialog
IMPLEMENT_DYNAMIC( CFolderDialog, CDialog )
CFolderDialog::CFolderDialog( IN LPCTSTR pszTitle /*NULL*/,
IN LPCTSTR pszSelPath /*NULL*/,
IN CWnd* pWndParent /*NULL*/,
IN UINT uFlags /*BIF_RETURNONLYFSDIRS*/ )
: CCommonDialog( pWndParent )
, m_hWnd( NULL )
{
::ZeroMemory( &m_bi, sizeof( BROWSEINFO ) );
::ZeroMemory( m_szFolPath, MAX_PATH );
::ZeroMemory( m_szSelPath, MAX_PATH );
// Fill data
m_bi.hwndOwner = pWndParent->GetSafeHwnd();
m_bi.pidlRoot = NULL;
m_bi.lpszTitle = pszTitle;
m_bi.ulFlags = uFlags;
m_bi.lpfn = (BFFCALLBACK)&BrowseCallbackProc;
m_bi.lParam = (LPARAM)this;
// The size of this buffer is assumed to be MAX_PATH bytes:
m_bi.pszDisplayName = new TCHAR[ MAX_PATH ];
ASSERT( m_bi.pszDisplayName != NULL );
SAFE_ZEROMEMORY(
m_bi.pszDisplayName, ( MAX_PATH * sizeof( TCHAR ) )
);
if( pszSelPath )
SetSelectedFolder( pszSelPath );
}
CFolderDialog::~CFolderDialog( VOID )
{
SAFE_COTASKMEMFREE( m_bi.pidlRoot );
SAFE_DELETE2( m_bi.pszDisplayName );
::ZeroMemory( &m_bi, sizeof( BROWSEINFO ) );
}
BEGIN_MESSAGE_MAP( CFolderDialog, CCommonDialog )
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFolderDialog message handlers
BOOL CFolderDialog::SetRootFolder( IN LPCTSTR pszPath )
{
ASSERT_VALID( this );
if( !pszPath )
{
SAFE_COTASKMEMFREE( m_bi.pidlRoot );
return TRUE;
}
ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );
HRESULT hResult = S_FALSE;
IShellFolder* pDeskFolder = NULL;
hResult = ::SHGetDesktopFolder( &pDeskFolder );
if ( hResult == S_OK )
{
LPITEMIDLIST pidlRoot = NULL;
LPTSTR pszRoot = const_cast< LPTSTR >( pszPath );
// Convert the path to an ITEMIDLIST:
USES_CONVERSION;
hResult = pDeskFolder->ParseDisplayName(
NULL, NULL, T2W( pszRoot ), NULL, &pidlRoot, NULL
);
if( hResult == S_OK )
{
SAFE_COTASKMEMFREE( m_bi.pidlRoot );
m_bi.pidlRoot = pidlRoot;
}
SAFE_RELEASE( pDeskFolder );
}
return ( hResult == S_OK );
}
BOOL CFolderDialog::GetRootFolder( IN OUT LPTSTR pszPath )
{
ASSERT_VALID( this );
ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );
return ::SHGetPathFromIDList( m_bi.pidlRoot, pszPath );
}
BOOL CFolderDialog::SetSelectedFolder( IN LPCTSTR pszPath )
{
ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );
return (BOOL)::lstrcpy( m_szSelPath, pszPath );
}
/////////////////////////////////////////////////////////////////////////////
#if ( _MFC_VER >= 0x0700 )
INT_PTR CFolderDialog::DoModal( VOID )
#else
INT CFolderDialog::DoModal( VOID )
#endif
{
ASSERT_VALID( this );
ASSERT( m_bi.lpfn != NULL );
INT_PTR nRet = -1;
m_bi.hwndOwner = PreModal();
LPITEMIDLIST pItemIDList = ::SHBrowseForFolder( &m_bi );
if( pItemIDList )
{
if( ::SHGetPathFromIDList( pItemIDList, m_szFolPath ) )
nRet = IDOK;
SAFE_COTASKMEMFREE( pItemIDList );
}
else
nRet = IDCANCEL;
PostModal();
return ( nRet );
}
/////////////////////////////////////////////////////////////////////////////
// Overridables:
VOID CFolderDialog::OnInitialized( VOID )
{
if( ::lstrlen( m_szSelPath ) > 0 )
SetSelection( m_szSelPath );
}
VOID CFolderDialog::OnSelChanged( IN LPITEMIDLIST pItemIDList )
{
if( m_bi.ulFlags & BIF_STATUSTEXT )
{
TCHAR szSelFol[ MAX_PATH ] = { 0 };
if( ::SHGetPathFromIDList( pItemIDList, szSelFol ) )
SetStatusText( szSelFol );
}
}
INT CFolderDialog::OnValidateFailed( IN LPCTSTR /*pszPath*/ )
{
::MessageBeep( MB_ICONHAND );
return 1; // Return 1 to leave dialog open, 0 - to end one
}
VOID CFolderDialog::OnIUnknown( IN IUnknown* /*pIUnknown*/ )
{
}
/////////////////////////////////////////////////////////////////////////////
// Callback function used with the SHBrowseForFolder function.
INT CALLBACK CFolderDialog::BrowseCallbackProc( IN HWND hWnd,
IN UINT uMsg,
IN LPARAM lParam,
IN LPARAM lpData )
{
CFolderDialog* pThis = (CFolderDialog*)lpData;
ASSERT( pThis != NULL );
INT nRet = 0;
pThis->m_hWnd = hWnd;
switch( uMsg )
{
case BFFM_INITIALIZED:
pThis->OnInitialized();
break;
case BFFM_SELCHANGED:
pThis->OnSelChanged( (LPITEMIDLIST)lParam );
break;
case BFFM_VALIDATEFAILED:
nRet = pThis->OnValidateFailed( (LPCTSTR)lParam );
break;
case BFFM_IUNKNOWN:
pThis->OnIUnknown( (IUnknown*)lParam );
break;
default:
ASSERT( FALSE );
break;
}
pThis->m_hWnd = NULL;
return nRet;
}
/////////////////////////////////////////////////////////////////////////////
// Commands, valid to call only from handlers
VOID CFolderDialog::SetExpanded( IN LPCTSTR pszPath )
{
USES_CONVERSION;
ASSERT( m_hWnd != NULL );
ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );
::SendMessage(
m_hWnd, BFFM_SETEXPANDED,
(WPARAM)TRUE, (LPARAM)T2CW( pszPath )
);
}
VOID CFolderDialog::SetOKText( IN LPCTSTR pszText )
{
USES_CONVERSION;
ASSERT( m_hWnd != NULL );
::SendMessage(
m_hWnd, BFFM_SETOKTEXT,
(WPARAM)0, (LPARAM)T2CW( pszText )
);
}
VOID CFolderDialog::EnableOK( IN BOOL bEnable /*TRUE*/ )
{
ASSERT( m_hWnd != NULL );
::SendMessage(
m_hWnd, BFFM_ENABLEOK, (WPARAM)bEnable, 0L
);
}
VOID CFolderDialog::SetSelection( IN LPITEMIDLIST pItemIDList )
{
ASSERT( m_hWnd != NULL );
::SendMessage(
m_hWnd, BFFM_SETSELECTION,
(WPARAM)FALSE, (LPARAM)pItemIDList
);
}
VOID CFolderDialog::SetSelection( IN LPCTSTR pszPath )
{
ASSERT( m_hWnd != NULL );
ASSERT( AfxIsValidString( pszPath, MAX_PATH ) );
::SendMessage(
m_hWnd, BFFM_SETSELECTION,
(WPARAM)TRUE, (LPARAM)pszPath
);
}
VOID CFolderDialog::SetStatusText( IN LPCTSTR pszText )
{
ASSERT( m_hWnd != NULL );
::SendMessage(
m_hWnd, BFFM_SETSTATUSTEXT,
(WPARAM)0, (LPARAM)pszText
);
}
// Shell version 5.0 or later:
VOID CFolderDialog::SetExpanded( IN LPITEMIDLIST pItemIDList )
{
ASSERT( m_hWnd != NULL );
::SendMessage(
m_hWnd, BFFM_SETEXPANDED,
(WPARAM)FALSE, (LPARAM)pItemIDList
);
}
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
#ifdef USE_XP_FILTRATION
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// CFilteredFolderDialog class
CFilteredFolderDialog::CFilteredFolderDialog( LPCTSTR pszTitle,
LPCTSTR pszSelPath,
CWnd* pParentWnd,
UINT uFlags )
: CFolderDialog( pszTitle, pszSelPath, pParentWnd, uFlags )
, m_pIMyFolderFilter( NULL )
, m_pszFilter( NULL )
{
}
CFilteredFolderDialog::~CFilteredFolderDialog( VOID )
{
SAFE_FREE( m_pszFilter );
//SAFE_RELEASEINTERFACE( m_pIFolderFilter )
}
VOID CFilteredFolderDialog::OnIUnknown( IN IUnknown* pIUnknown )
{
ASSERT( pIUnknown != NULL );
if( m_pIMyFolderFilter == NULL )
{
IFolderFilterSite* pIFolderFilterSite = NULL;
HRESULT hResult = pIUnknown->QueryInterface( IID_IFolderFilterSite, (LPVOID*)&pIFolderFilterSite );
if( SUCCEEDED( hResult ) )
{
m_pIMyFolderFilter = new IMyFolderFilter;
ASSERT( m_pIMyFolderFilter != NUL
- 1
- 2
前往页