Cuadro de dialogo para seleccionar un directorio

raf
10 de Marzo del 2005
(Visula c++)
Hola, alguien me puede decir como hacer un cuadro de dialogo para seleccionar un directorio. Algo parecido al CFileDialog pero para directorios.
Gracias amigos!

carmamezo
10 de Marzo del 2005
Bueno, aki te dejo una forma de hacerlo mediante MFC-s, está sacado del libro: "Advanced MFC programming ".

BROWSEINFO bi;
char szBuf[MAX_PATH];
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
CString szStr;

if(::SHGetMalloc(&pMalloc)==NOERROR)
{
bi.hwndOwner=NULL;
bi.pidlRoot=NULL;
bi.pszDisplayName=szBuf;
bi.lpszTitle=_T("Selecciona directorio");
bi.ulFlags=BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn=NULL;
bi.lParam=0;
if((pidl=::SHBrowseForFolder(&bi))!=NULL)
{
if(::SHGetPathFromIDList(pidl,szBuf))
{
szStr=szBuf;
AfxMessageBox(szStr);
}
pMalloc->Free(pidl);
}
pMalloc->Release();
}

Un saludo....

raf
10 de Marzo del 2005
Muchas gracias carmamezo, ahora ya tengo resuleto el problema. Y ademas de una manera elegante!!
Gracias y suerte!

Joel
10 de Marzo del 2005
Hola, paseando por la red di con este tema y creo que la respuesta es correcta, sin embargo... el uso de IMalloc ya está descontinuado por MSN.. esta la opcion actualizada que, es soportada por los antiguos Windows y, lo que se espera, sea la que usen los nuevos:

// codigo //

BOOL SHBrowseForAFolder(HWND hwndOwner, char* szTitle, char* szBuffer)
{
BOOL bRet;
BROWSEINFO bi;

ZeroMemory(&bi, sizeof(BROWSEINFO));

bi.hwndOwner = hwndOwner;
bi.pidlRoot = NULL;
bi.pszDisplayName = szBuffer;
bi.lpszTitle = szTitle;
bi.lpfn = FolderProc;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lParam = 0;
bi.lpfn = NULL;

LPITEMIDLIST pidl = (LPITEMIDLIST)CoTaskMemAlloc(sizeof(LPITEMIDLIST));

pidl = SHBrowseForFolder(&bi);

if (SHGetPathFromIDList(pidl, szBuffer))
{
bRet = TRUE;
}
else
{
bRet = FALSE;
}

CoTaskMemFree(pidl);
return bRet;
}

// codigo //