mfc CFileDialog, используя IFileOpenDialog для поиска папки
Я нашел следующий код, чтобы позволить мне искать папку
CFileDialog od(TRUE/*bOpenFileDialog*/, NULL, NULL, OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT , NULL, NULL, 0, TRUE/*bVistaStyle*/);
IFileOpenDialog * openDlgPtr = od.GetIFileOpenDialog();
if ( openDlgPtr != NULL )
{
openDlgPtr->SetOptions(FOS_PICKFOLDERS);
openDlgPtr->Release();
}
int r = od.DoModal();
он открывает диалоговое окно файла, и я могу выбрать папку, и кнопка Открыть становится активной, но нажатие на нее просто открывает папку, но не выбирает ее. DoModal не вернется, пока я не нажму Отмена
Любые идеи, как я могу выбрать папку в MFC? Спасибо
Кстати, я знаю о CFolderDialog http://www.codeproject.com/Articles/2024/CFolderDialog-Selecting-Folders?msg=4497794
хороший проект, но когда я выбираю папку USB для Android, диалоговое окно возвращается не в порядке, поэтому его бесполезно, если я не могу это исправить
ОБНОВИТЬ
я также нашел это
BROWSEINFO bi = { 0 };
TCHAR path[MAX_PATH];
bi.lpszTitle = _T("Pick a Directory");
bi.pszDisplayName = path;
LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
if ( pidl != 0 )
{
// get the name of the folder
//_tprintf ( _T("Selected Item: %s\n"), path );
// free memory used
IMalloc * imalloc = 0;
if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
{
imalloc->Free ( pidl );
imalloc->Release ( );
}
setMobilePath(path);
}
что позволяет мне выбрать папку на моем устройстве Android, но не возвращает полный путь, только имя папки, которая также мало используется
1 ответ
Преобразуйте возвращенный pidl в строку следующим образом:
BROWSEINFO bi = { 0 };
bi.lpszTitle = _T("Pick a Directory");
LPITEMIDLIST pidl = SHBrowseForFolder (&bi);
if (pidl != 0)
{ // convert pidl to string
TCHAR szPath[MAX_PATH];
SHGetPathFromIDList(pidl, szPath);
// free memory used
IMalloc * imalloc = 0;
if ( SUCCEEDED( SHGetMalloc(&imalloc)))
{ imalloc->Free (pidl);
imalloc->Release();
}
//_tprintf(_T("Selected Item: %s\n"), szPath);
setMobilePath(szPath);
}
Попробуй это
CFolderPickerDialog dlgFolder;
if (dlgFolder.DoModal() == IDOK)
{
CString strFolder = dlgFolder.GetPathName();
AfxMessageBox(strFolder);
}