2013-01-01 15 views
5

Sto cercando di creare un semplice browser cartella di MFC e cercare risposte a MSDN e anche qui: questo è il mio codice finora:MFC del browser cartella 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(); 
} 

gli errori che sto ricevendo sono:

  1. puntatore al tipo di classe incompleta non è consentito (questo è per openDlg)
  2. identificatore "FOS_PICKFOLDERS" è indefinito

sto lavorando su Visual Studio 2010, win7

+0

Dov'è openDlgPtr? Non riesco a vedere nello snippet di codice. "FOS_PICKFOLDERS" è definito in ShObjIdl.h, assicurati di averlo incluso – stamhaney

+0

risolverò quella scusa openDlg invece di openDlgPtr. ho aggiunto #include "ShObjIdl.h" non è ancora riconosciuto –

+1

Non si sta impostando correttamente la macro della versione della finestra di destinazione (_WIN32_WINNT). IFileOpenDialog è disponibile solo in 0x600 e versioni successive. –

risposta

7

ero anche alla ricerca di questo codice per molto tempo, ho trovato questo in un 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

Questa è una finestra di dialogo completamente diversa. Uno piuttosto disprezzato. –

+1

è un modo rapido per creare un browser di cartelle invece di scrivere una classe speciale in-order per derivare da SHBrowseForFolder alla fine. Tuttavia @HansPassant se puoi dare una soluzione migliore in meno di 100 linee. puoi aiutarmi anche tu. quindi per favore condividi – Gilad

3

So che è una domanda obsoleto po 'ma di recente ho avuto lo stesso problema e anche faticato a trovare una soluzione semplice e facile da usare.

Ho trovato questa classe CFileBrowser-come essere una soluzione molto efficace e semplice a questo problema:

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

Questa classe non funziona con Windows 10 – Krapow