198 lines
No EOL
5.6 KiB
C++
198 lines
No EOL
5.6 KiB
C++
#pragma once
|
|
|
|
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData);
|
|
BOOL ExportBrowseFolder(HWND hWnd, TCHAR *szFolder);
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/*
|
|
DESCRIPTION:
|
|
CFolderDialog - Folder Selection Dialog Class
|
|
Copyright(C) Armen Hakobyan, 2002 - 2005
|
|
http://www.codeproject.com/dialog/cfolderdialog.asp
|
|
|
|
VERSION HISTORY:
|
|
24 Mar 2002 - First release
|
|
30 Mar 2003 - Some minor changes
|
|
- Added missing in old Platform SDK new flag definitions
|
|
- Added support for both MFC 6.0 and 7.0
|
|
- Added OnIUnknown handler for Windows XP folder filtration
|
|
- Added SetExpanded and SetOKText and GetSelectedFolder functions
|
|
24 May 2003 - Added OnSelChanged implementation
|
|
14 Jul 2003 - Added custom filtration for Windows XP, thanks to Arik Poznanski
|
|
29 Nov 2003 - Added SetRootFolder, thanks to Eckhard Schwabe ( and Jose Insa )
|
|
02 Jan 2004 - Added GetRootFolder, uncomment if needed
|
|
15 Feb 2005 - Small bug fix in DoModal, thanks to WindSeven
|
|
*/
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __FOLDERDLG_H__
|
|
#define __FOLDERDLG_H__
|
|
|
|
#if defined( _MSC_VER ) && ( _MSC_VER >= 1020 )
|
|
#pragma once
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __AFXDLGS_H__
|
|
#include < AfxDlgs.h >
|
|
#endif
|
|
|
|
#ifndef __ATLCONV_H__
|
|
#include < AtlConv.h > // MBCS/Unicode Conversion Macros
|
|
#endif
|
|
|
|
// Uncomment if using GetRootFolder
|
|
//#ifndef _INC_SHLWAPI
|
|
// #include < shlwapi.h >
|
|
//#endif
|
|
//#pragma comment( lib, "shlwapi.lib" )
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef SAFE_DELETE2
|
|
#define SAFE_DELETE2( p ) \
|
|
if( p ){ delete[] p; p = NULL; }
|
|
#endif
|
|
|
|
#ifndef SAFE_ZEROMEMORY
|
|
#define SAFE_ZEROMEMORY( p, size ) \
|
|
if( p ){ ZeroMemory( p, size ); }
|
|
#endif
|
|
|
|
#ifndef SAFE_RELEASE
|
|
#if defined( __cplusplus )
|
|
#define SAFE_RELEASE( p ) \
|
|
if( p ){ p->Release(); p = NULL; }
|
|
#else
|
|
#define SAFE_RELEASE( p ) \
|
|
if( p ){ p->lpVtbl->Release( p ); p = NULL; }
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef SAFE_COTASKMEMFREE
|
|
#define SAFE_COTASKMEMFREE( p ) \
|
|
if( p ){ CoTaskMemFree( (LPVOID)p ); p = NULL; }
|
|
#endif
|
|
|
|
#ifndef _countof
|
|
#define _countof( x ) \
|
|
( sizeof( x ) / sizeof( x[ 0 ] ) )
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef BFFM_SETOKTEXT // Version 5.0 or later
|
|
#define BFFM_SETOKTEXT ( WM_USER + 105 ) // Unicode only, req. BIF_USENEWUI
|
|
#define BFFM_SETEXPANDED ( WM_USER + 106 ) // Unicode only, req. BIF_USENEWUI
|
|
#endif
|
|
|
|
#ifndef BIF_NEWDIALOGSTYLE // Version 5.0 or later
|
|
#define BIF_NEWDIALOGSTYLE 0x0040
|
|
#define BIF_BROWSEINCLUDEURLS 0x0080
|
|
#define BIF_UAHINT 0x0100 // Req. BIF_NEWDIALOGSTYLE
|
|
#define BIF_NONEWFOLDERBUTTON 0x0200
|
|
#define BIF_NOTRANSLATETARGETS 0x0400
|
|
#define BIF_SHAREABLE 0x8000 // Req. BIF_USENEWUI
|
|
#define BIF_USENEWUI ( BIF_NEWDIALOGSTYLE | BIF_EDITBOX )
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CFolderDialog : public CCommonDialog
|
|
{
|
|
DECLARE_DYNAMIC( CFolderDialog )
|
|
|
|
public:
|
|
CFolderDialog( IN LPCTSTR pszTitle = NULL,
|
|
IN LPCTSTR pszSelPath = NULL,
|
|
IN CWnd* pWndParent = NULL,
|
|
IN UINT uFlags = BIF_RETURNONLYFSDIRS );
|
|
virtual ~CFolderDialog( VOID );
|
|
|
|
public:
|
|
#if ( _MFC_VER >= 0x0700 ) // VC++ 2002 (7.0)
|
|
virtual INT_PTR DoModal( VOID );
|
|
#else
|
|
virtual INT DoModal( VOID );
|
|
#endif
|
|
|
|
BOOL SetRootFolder( IN LPCTSTR pszPath );
|
|
BOOL GetRootFolder( IN OUT LPTSTR pszPath );
|
|
BOOL SetSelectedFolder( IN LPCTSTR pszPath );
|
|
|
|
public:
|
|
AFX_INLINE LPCTSTR GetFolderPath( VOID ) const;
|
|
AFX_INLINE LPCTSTR GetFolderName( VOID ) const;
|
|
AFX_INLINE INT GetFolderImage( VOID ) const;
|
|
AFX_INLINE LPCTSTR GetSelectedFolder( VOID ) const;
|
|
|
|
AFX_INLINE BROWSEINFO& GetBI( VOID );
|
|
AFX_INLINE const BROWSEINFO& GetBI( VOID ) const;
|
|
|
|
protected:
|
|
BROWSEINFO m_bi;
|
|
|
|
TCHAR m_szSelPath[ MAX_PATH ];
|
|
TCHAR m_szFolPath[ MAX_PATH ];
|
|
|
|
protected:
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
protected: // Overridables
|
|
|
|
virtual VOID OnInitialized( VOID );
|
|
virtual VOID OnSelChanged( IN LPITEMIDLIST pItemIDList );
|
|
virtual INT OnValidateFailed( IN LPCTSTR /*pszPath*/ );
|
|
|
|
protected: // Windows XP or later
|
|
virtual VOID OnIUnknown( IN IUnknown* /*pIUnknown*/ );
|
|
|
|
protected: // Valid to call only from the above handlers
|
|
|
|
VOID EnableOK( IN BOOL bEnable = TRUE );
|
|
VOID SetSelection( IN LPITEMIDLIST pItemIDList );
|
|
VOID SetSelection( IN LPCTSTR pszPath );
|
|
VOID SetStatusText( IN LPCTSTR pszText );
|
|
|
|
protected: // Shell version 5.0 or later:
|
|
VOID SetExpanded( IN LPCTSTR pszPath );
|
|
VOID SetExpanded( IN LPITEMIDLIST pItemIDList );
|
|
VOID SetOKText( IN LPCTSTR pszText );
|
|
|
|
private:
|
|
HWND m_hWnd; // used only in the callback function
|
|
|
|
private:
|
|
static INT CALLBACK BrowseCallbackProc(
|
|
IN HWND hWnd, IN UINT uMsg, IN LPARAM lParam, IN LPARAM lpData
|
|
);
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
AFX_INLINE LPCTSTR CFolderDialog::GetSelectedFolder( VOID ) const
|
|
{ return m_szSelPath; }
|
|
|
|
AFX_INLINE BROWSEINFO& CFolderDialog::GetBI( VOID )
|
|
{ return m_bi; }
|
|
|
|
AFX_INLINE const BROWSEINFO& CFolderDialog::GetBI( VOID ) const
|
|
{ return m_bi; }
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Filled after a call to DoModal
|
|
|
|
AFX_INLINE LPCTSTR CFolderDialog::GetFolderPath( VOID ) const
|
|
{ return m_szFolPath; }
|
|
|
|
AFX_INLINE LPCTSTR CFolderDialog::GetFolderName( VOID ) const
|
|
{ return m_bi.pszDisplayName; }
|
|
|
|
AFX_INLINE INT CFolderDialog::GetFolderImage( VOID ) const
|
|
{ return m_bi.iImage; }
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#endif // __FOLDERDLG_H__
|
|
/////////////////////////////////////////////////////////////////////////////
|