123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- /////////////////////////////////////////////////////////////////////////////
- /*
- 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 EXPORT_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__
- /////////////////////////////////////////////////////////////////////////////
|