Cuadro de dialogo para seleccionar un directorio
(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!
Hola, alguien me puede decir como hacer un cuadro de dialogo para seleccionar un directorio. Algo parecido al CFileDialog pero para directorios.
Gracias amigos!
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....
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....
Muchas gracias carmamezo, ahora ya tengo resuleto el problema. Y ademas de una manera elegante!!
Gracias y suerte!
Gracias y suerte!
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 //
// 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 //
