2013-01-01 60 views
5

我試圖創建一個簡單的MFC文件夾瀏覽器,並尋找在MSDN答案,這裏還有: 這是我到目前爲止的代碼:MFC文件夾瀏覽器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(); 
} 

,我發現了錯誤有:

  1. 指針不完整的類型是不允許的(這是openDlg)
  2. 標識符 「FOS_PICKFOLDERS」 未定義

我工作的Visual Studio 2010,win7的

+0

哪裏openDlgPtr?我在代碼片段中看不到。 「FOS_PICKFOLDERS」在ShObjIdl.h定義,請確保您有它包括 – stamhaney

+0

我會解決抱歉openDlg代替openDlgPtr。我加的#include「ShObjIdl.h」,它仍然無法識別 –

+1

您沒有設置目標窗口版本(_WIN32_WINNT)宏正常。 IFileOpenDialog僅在0x600及更高版本中可用。 –

回答

7

我也在找這個代碼很長一段時間,我都在一個論壇上發現這一點。

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

這是一個完全不同的對話框。一個相當廣泛被鄙視的人。 –

+1

它是創造,而不是寫在順序一個特殊的類,從的SHBrowseForFolder最終得到的文件夾瀏覽器的快捷方式。然而@HansPassant如果你能在100行以內提供更好的解決方案。你也可以幫助我。所以請分享 – Gilad

3

我知道這是一個有點過時的問題,但最近我有同樣的問題,並在努力尋找一個簡單和易於使用的解決方案。

我發現這個CFileBrowser類類是一個非常有效和簡單的解決這個問題:

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

該課程在Windows 10下無法使用 – Krapow