2013-01-01 15 views
5

próbuję utworzyć prostą przeglądarkę folderu MFC i poszukać odpowiedzi w MSDN i również tutaj: to jest mój kod do tej pory:MFC przeglądarka folderu IFileOpenDialog

void CAddFilterDlg::OnBnClickedAddDll() 
{ 
    CFileDialog dlg(TRUE/*bOpenFileDialog*/, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , NULL, NULL, 0, TRUE/*bVistaStyle*/); 
    CString folderPath = dlg.GetFolderPath(); 
    IFileOpenDialog * openDlg = dlg.GetIFileOpenDialog(); 
    if (openDlg != NULL) 
    { 
     openDlg->SetOptions(FOS_PICKFOLDERS); 
     openDlg->Release(); 
    } 

dlg.DoModal(); 
} 

błędy Dostaję to:

  1. wskaźnik niepełnego typu klasy nie może (to jest dla openDlg)
  2. charakterystyki "FOS_PICKFOLDERS" jest zdefiniowana

Pracuję nad Visual Studio 2010, Win7

+0

Gdzie jest openDlgPtr? Nie widzę w fragmencie kodu. "FOS_PICKFOLDERS" jest zdefiniowany w ShObjIdl.h, upewnij się, że zawiera go – stamhaney

+0

Naprawię to przepraszam openDlg zamiast openDlgPtr. Dodałem #include "ShObjIdl.h" nadal nie jest rozpoznawany –

+1

Nie ustawiłeś poprawnie makra wersji okna docelowego (_WIN32_WINNT). Opcja IFileOpenDialog jest dostępna tylko w 0x600 iw górę. –

Odpowiedz

7

ja również poszukuje tego kodu przez długi czas, znalazłem to na forum.

void CAddFilterDlg::OnBnClickedAddDll() 
{ 
BROWSEINFO bi = {0}; 
bi.lpszTitle = _T("Select Folder"); 
LPITEMIDLIST pidl = SHBrowseForFolder (&bi); 
if (pidl != 0) 
{ 
    // get the name of the folder 
    TCHAR path[MAX_PATH]; 
    SHGetPathFromIDList (pidl, path); 

    // free memory used 
    IMalloc * imalloc = 0; 
    if (SUCCEEDED(SHGetMalloc (&imalloc))) 
    { 
     imalloc->Free (pidl); 
     imalloc->Release(); 
    } 
} 

} 
+0

To jest zupełnie inne okno dialogowe. Całkiem pogardzana. –

+1

to szybki sposób na utworzenie przeglądarki folderów, zamiast pisania specjalnej klasy, aby w końcu wyprowadzić z SHBrowseForFolder. Jednak @HansPassant, jeśli możesz dać lepsze rozwiązanie w mniej niż 100 liniach. możesz mi również pomóc. więc proszę udostępnij – Gilad

3

Wiem, że to nieco przestarzały, ale pytanie Niedawno miałem ten sam problem, a także starał się znaleźć prosty i łatwy w użyciu rozwiązanie.

Znalazłem CFileBrowser podobną klasę być bardzo skuteczne i proste rozwiązanie tego problemu:

CFolderPickerDialog FolderSelectDialog(theApp.xAM->GetExportPath().c_str(),NULL,this); 

if (FolderSelectDialog.DoModal() == IDOK) 
{ 
    CString cBuff = FolderSelectDialog.GetPathName(); 

    std::wstring wsPath = std::wstring(cBuff); 

    theApp.xAM->SetExportPath(wsPath); 

    CEditExportFolderPath.SetWindowTextW(cBuff); 
} 
+0

Ta klasa nie działa w systemie Windows 10 – Krapow