www.pudn.com > Property_List_src.zip > FoldersDialog.cpp
// FoldersDialog.cpp: implementation of the CFoldersDialog class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FoldersDialog.h"
TCHAR szSelectedDir[MAX_PATH];
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFoldersDialog::CFoldersDialog()
{
}
CFoldersDialog::~CFoldersDialog()
{
}
LPITEMIDLIST ConvertPathToLpItemIdList(const char *pszPath)
{
LPITEMIDLIST pidl;
LPSHELLFOLDER pDesktopFolder;
OLECHAR olePath[MAX_PATH];
ULONG chEaten;
ULONG dwAttributes;
HRESULT hr;
if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))
{
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszPath, -1, olePath, MAX_PATH);
hr = pDesktopFolder->ParseDisplayName(NULL, NULL, olePath, &chEaten, &pidl, &dwAttributes);
pDesktopFolder->Release();
}
return pidl;
}
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData)
{
switch(uMsg)
{
case BFFM_INITIALIZED:
{
/* change the selected folder. */
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
break;
}
case BFFM_SELCHANGED:
{
// Set the status window to the currently selected path.
if (SHGetPathFromIDList((LPITEMIDLIST) lp , szSelectedDir))
SendMessage(hwnd,BFFM_SETSTATUSTEXT, 0, (LPARAM)szSelectedDir);
break;
}
default:
break;
}
return 0;
}
BOOL CFoldersDialog::BrowseFolder(HWND hWnd, CString curPath, CString rootPath)
{
BROWSEINFO bi;
TCHAR szDir[MAX_PATH];
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
BOOL bRet;
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
bRet = TRUE;
ZeroMemory(&bi,sizeof(bi));
bi.hwndOwner = hWnd;
bi.pszDisplayName = 0;
bi.lpszTitle = 0;
bi.pidlRoot = ConvertPathToLpItemIdList(rootPath);
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (long) curPath.GetBuffer(0);
pidl = SHBrowseForFolder(&bi);
if (pidl)
SHGetPathFromIDList(pidl,szDir);
else
bRet = FALSE;
pMalloc->Free(pidl);
pMalloc->Release();
}
return bRet;
}
CString CFoldersDialog::GetFolder()
{
return szSelectedDir;
}