// Deklaration (in .h)
/////////////////////////////////////////////////////////////////////////////////
CString BrowseFolder(LPCTSTR lpszTitle, LPCTSTR lpszDefault, LPCTSTR lpszRoot);
static int CALLBACK BrowseCallBackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData);
// Implementierung (in .cpp)
/////////////////////////////////////////////////////////////////////////////////
#ifndef BIF_NEWDIALOGSTYLE
#define BIF_NEWDIALOGSTYLE 0x0040
#endif
//-------------------------------------------------------------------
// Beschreibung: Pfadauswahldialog
//-------------------------------------------------------------------
// Parameter: lpszDefault ... voreingestellter Pfad
// lpszTitle ... Dialogtitel
// lpszRoot ... Pfad, ab dem Struktur angezeigt
// wird
// RETURN Gewählter Ordner oder leer bei Abbruch
//-------------------------------------------------------------------
CString CMyDialog::BrowseFolder( LPCTSTR lpszTitle,
LPCTSTR lpszDefault,
LPCTSTR lpszRoot)
{
BROWSEINFO brInf;
LPITEMIDLIST pidl;
LPSHELLFOLDER pshf;
ULONG pchEaten;
OLECHAR olePath[_MAX_PATH];
TCHAR lpBuffer[_MAX_PATH];
if( SUCCEEDED(SHGetDesktopFolder(&pshf)) )
{
if( lpszRoot )
{
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)lpszRoot, -1, olePath, _MAX_PATH);
pshf->ParseDisplayName(GetSafeHwnd(), NULL, olePath, &pchEaten, &pidl, NULL);
brInf.pidlRoot = pidl;
}
else
{
brInf.pidlRoot = NULL;
}
brInf.hwndOwner = GetSafeHwnd();
brInf.pszDisplayName = lpBuffer;
brInf.lpszTitle = lpszTitle;
brInf.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
brInf.lpfn = BrowseCallBackProc;
brInf.lParam = (LPARAM)lpszDefault;
brInf.iImage = 0;
pidl = SHBrowseForFolder(&brInf);
if( pidl )
{
SHGetPathFromIDList(pidl, lpBuffer);
return CString(lpBuffer);
}
}
return CString(_T(""));
}
//-------------------------------------------------------------------
// Callback-Funktion für SHBrowseForFolder
//-------------------------------------------------------------------
int CALLBACK CMyDialog::BrowseCallBackProc( HWND hwnd,
UINT uMsg,
LPARAM lp,
LPARAM pData )
{
switch( uMsg )
{
case BFFM_INITIALIZED:
if( pData )
{
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
}
break;
}
return 0;
}