2

フォルダーを参照できるようにする次のコードを見つけました

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#xx4497794xx

素敵なプロジェクトですが、USBマウントされたAndroidフォルダーを選択すると、ダイアログがOKを返さないので、修正できない限り役に立ちません

アップデート

私もこれを見つけました

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デバイスのフォルダーを選択できますが、完全なパスは返されず、あまり使用されないフォルダー名だけが返されます

4

2 に答える 2

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);
}
于 2013-02-17T20:55:32.707 に答える
0

これを試してください

CFolderPickerDialog dlgFolder;

if (dlgFolder.DoModal() == IDOK)
{
    CString strFolder = dlgFolder.GetPathName();
    AfxMessageBox(strFolder);
}
于 2019-02-10T18:50:55.773 に答える