CFileDialog :: Просмотр папок - PullRequest
       11

CFileDialog :: Просмотр папок

7 голосов
/ 20 августа 2009

Когда я пытаюсь создать экземпляр объекта CFileDialog, он показывает как папки, так и файлы. Как создать CFileDialog, который просматривает только папки?

Ответы [ 6 ]

11 голосов
/ 20 августа 2009

Вы не можете сделать это с CFileDialog.

Либо вы будете использовать SHBrowseForFolder Function или оболочку для нее,
like CFolderDialog - Выбор папок.

10 голосов
/ 28 октября 2015

Это очень просто, правда.

Используйте CFolderPickerDialog, который является производным от класса CFileDialog!

5 голосов
/ 23 августа 2012

Начиная с Vista, рекомендуется использовать IFileDialog с опцией FOS_PICKFOLDERS ( см. Msdn ):

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();
   }

   od.DoModal();
2 голосов
/ 16 мая 2017

начиная с Windows Vista, вы можете использовать Общий элемент диалога .

void CQiliRegrvDlg::OnBnClickedSelectDir()
{
HRESULT hr = S_OK;

// Create a new common open file dialog.
IFileOpenDialog *pfd = NULL;
hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
    IID_PPV_ARGS(&pfd));
if (SUCCEEDED(hr))
{
    // Set the dialog as a folder picker.
    DWORD dwOptions;
    hr = pfd->GetOptions(&dwOptions);
    if (SUCCEEDED(hr))
    {
        hr = pfd->SetOptions(dwOptions | FOS_PICKFOLDERS);
    }

    // Set the title of the dialog.
    if (SUCCEEDED(hr))
    {
        hr = pfd->SetTitle(L"Folder");
    }
    // Show the open file dialog.
    if (SUCCEEDED(hr))
    {
        hr = pfd->Show(m_hWnd);
        if (SUCCEEDED(hr))
        {
            // Get the selection from the user.
            IShellItem *psiResult = NULL;
            hr = pfd->GetResult(&psiResult);
            if (SUCCEEDED(hr))
            {
                PWSTR pszPath = NULL;
                hr = psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszPath);
                if (SUCCEEDED(hr))
                {
                    m_appDir = pszPath;
                    SetDlgItemText(IDC_STATIC, m_appDir);
                    CoTaskMemFree(pszPath);
                }
                psiResult->Release();
            }
        }
    }

    pfd->Release();
  }
  }
2 голосов
/ 24 февраля 2016

Как кто-то упоминал, используйте CFolderPickerDialog , который прекрасно работает. Я хотел бы привести пример того, как его использовать, особенно при использовании флага множественного выбора:

CFolderPickerDialog folderPickerDialog(initialFolder, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_ENABLESIZING, this,
        sizeof(OPENFILENAME));

    CString folderPath;

    if (folderPickerDialog.DoModal() == IDOK)
    {

        POSITION pos = folderPickerDialog.GetStartPosition();

        while (pos)
        {
            folderPath = folderPickerDialog.GetNextPathName(pos);

        }
    }
0 голосов
/ 28 августа 2014

Мне кажется, ответ на ваш вопрос находится внутри кода

CMFCPropertyGridFileProperty::OnClickButton(CPoint /*point*/)

из

<Your Visual Studio installation folder>\VC\atlmfc\src\mfc\afxpropertygridctrl.cpp

файл.

Если у вас нет доступа к коду, я опубликую его важную часть:

CString strPath = m_varValue.bstrVal;
BOOL bUpdate = FALSE;

if (m_bIsFolder)
{
    if (afxShellManager == NULL)
    {
        CWinAppEx* pApp = DYNAMIC_DOWNCAST(CWinAppEx, AfxGetApp());
        if (pApp != NULL)
        {
            pApp->InitShellManager();
        }
    }

    if (afxShellManager == NULL)
    {
        ASSERT(FALSE);
    }
    else
    {
        bUpdate = afxShellManager->BrowseForFolder(strPath, m_pWndList, strPath);
    }
}
else
{
    CFileDialog dlg(m_bOpenFileDialog, m_strDefExt, strPath, m_dwFileOpenFlags, m_strFilter, m_pWndList);
    if (dlg.DoModal() == IDOK)
    {
        bUpdate = TRUE;
        strPath = dlg.GetPathName();
    }
}

Как видите, сама Microsoft не использует класс Cfiledialog, когда хочет открыть диалоговое окно для выбора папок.

Для использования подобного кода ваш класс приложения ДОЛЖЕН быть получен из CWinAppEx, а не CWinApp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...