2013-01-01 34 views
5

tôi đang cố gắng để tạo ra một trình duyệt thư mục MFC đơn giản và tìm kiếm câu trả lời trong MSDN và đây cũng như: đây là mã của tôi cho đến nay:MFC trình duyệt thư mục 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(); 
} 

các lỗi tôi nhận được là:

  1. con trỏ đến kiểu lớp không đầy đủ là không được phép (điều này là dành cho openDlg)
  2. định danh "FOS_PICKFOLDERS" là undefined

tôi đang làm việc trên visual studio 2010, win7

+0

openDlgPtr ở đâu? Tôi không thể nhìn thấy trong đoạn mã. "FOS_PICKFOLDERS" được định nghĩa trong ShObjIdl.h, hãy chắc chắn rằng bạn có nó bao gồm – stamhaney

+0

tôi sẽ sửa lỗi đó xin lỗi openDlg thay vì openDlgPtr. i thêm #include "ShObjIdl.h" nó vẫn không được nhận dạng –

+1

Bạn không đặt macro phiên bản cửa sổ đích (_WIN32_WINNT) đúng cách. IFileOpenDialog chỉ có sẵn trong 0x600 trở lên. –

Trả lời

7

tôi cũng đang tìm kiếm mã này trong một thời gian dài, tôi đã thấy điều này trong một diễn đàn.

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

Đây là một hộp thoại hoàn toàn khác. Một cái nhìn khá khinh thường. –

+1

nó là một cách nhanh chóng để tạo một trình duyệt thư mục thay vì viết một lớp đặc biệt theo thứ tự để lấy được từ SHBrowseForFolder cuối cùng. Tuy nhiên @HansPassant nếu bạn có thể đưa ra một giải pháp tốt hơn trong ít hơn 100 dòng. bạn cũng có thể giúp tôi. vì vậy hãy chia sẻ – Gilad

3

Tôi biết đó là một câu hỏi lỗi thời nhưng gần đây tôi gặp vấn đề tương tự và cũng phải vật lộn để tìm một giải pháp đơn giản và dễ sử dụng.

tôi thấy lớp CFileBrowser-như thế này là một giải pháp rất hiệu quả và đơn giản cho vấn đề này:

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

Lớp này không hoạt động trong Windows 10 – Krapow

Các vấn đề liên quan