2009-10-15 6 views
0

Dans MFC, existe-t-il une boîte de dialogue Ouvrir un dossier? Autrement dit, plutôt que de choisir un nom de fichier, il choisit un nom de dossier? Idéalement, j'aimerais que ce soit comme Visual Studio le fait lors de la navigation pour un "Project Location" (lors de la création d'un nouveau projet), qui ressemble beaucoup à une boîte de dialogue de fichier normale. Mais je pourrais faire avec l'un des types d'interfaces vertical tree si le premier n'existe pas.Boîte de dialogue MFC Open Folder

+3

voir: http://stackoverflow.com/questions/1304784/cfiledialog-browse-folders –

Répondre

4

Ce code vous donnera une boîte de dialogue de dossier ouvert (ceci a été pris de quelque part sur le Web mais je ne sais pas vraiment où).

CString szSelectedFolder = _T(""); 

// This is the recommended way to select a directory 
// in Win95 and NT4. 
BROWSEINFO bi; 
memset((LPVOID)&bi, 0, sizeof(bi)); 
TCHAR szDisplayName[_MAX_PATH]; 
szDisplayName[0] = '\0'; 
bi.hwndOwner = GetSafeHwnd(); 
bi.pidlRoot = NULL; 
bi.pszDisplayName = szDisplayName; 
bi.lpszTitle = _T("Select a folder"); 
bi.ulFlags = BIF_RETURNONLYFSDIRS; 
// Set the callback function 
bi.lpfn = BrowseCallbackProc; 

LPITEMIDLIST pIIL = ::SHBrowseForFolder(&bi); 
TCHAR szReturnedDir[_MAX_PATH]; 

BOOL bRet = ::SHGetPathFromIDList(pIIL, (TCHAR*)&szReturnedDir); 
if (bRet) 
{ 
    if (szReturnedDir != _T("")) 
    { 
     szSelectedFolder = szReturnedDir; 
    } 

    LPMALLOC pMalloc; 
    HRESULT HR = SHGetMalloc(&pMalloc); 
    pMalloc->Free(pIIL); 
    pMalloc->Release(); 
} 

vous aurez également à mettre en œuvre cette fonction de rappel:

TCHAR szInitialDir[_MAX_PATH]; 

// Set the initial path of the folder browser 
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) 
{ 
    // Look for BFFM_INITIALIZED 
    if (uMsg == BFFM_INITIALIZED) 
    { 
     SendMessage(hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)szInitialDir); 
    } 
    return 0; 
} 
+0

Au lieu de la memset, je préférez BROWSEINFO bi = {0}; –

+0

Ce n'est pas tout à fait ce que je veux, mais c'est ce que je vais devoir utiliser - ne semble pas qu'une alternative existe sans trop de travail. – Smashery