Начальный каталог не работает для CFileDialog

Я использую CFileDialog, я установил начальный путь, как показано ниже, как показано в коде. Это не работает. Поправь меня, если я допустил ошибку.

   CFileDialog* filedlg = new CFileDialog(TRUE,(LPCTSTR)NULL ,  (LPCTSTR)NULL , OFN_HIDEREADONLY| OFN_ENABLESIZING , (LPCTSTR)NULL , FromHandle (hImgDlg) ,0 , FALSE  );

   filedlg ->m_ofn.lpstrInitialDir = "C:\\" ;

   if ( filedlg ->DoModal() == IDOK )
   {
       /***  do somthing here *****/
   }

3 ответа

Решение

Если вы видите ссылку на OPENFILENAME структура, вы увидите, что для lpstrInitialDir В поле говорится, что:

Если lpstrInitialDir имеет то же значение, которое было передано в первый раз, когда приложение использовало Open или же Save As В диалоговом окне в качестве исходного каталога используется последний выбранный пользователем путь.

Это означает, что lpstrInitialDir Поле действительно может использоваться только при первом использовании диалогового окна в программе. В остальное время он будет использовать последний каталог, выбранный пользователем.

Два варианта: 1. Старомодный стиль диалога с указанием OFN:: lpstrInitialDir

CFileLatinDialog dlg (TRUE, "", "" /*lpszFileName */,
   OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
   "All Files(*.*)|*.*||", this, 0,
   FALSE /*bVistaStyle*/);
dlg.m_ofn.lpstrInitialDir = "C:\\Models\\";
  1. Диалог в стиле Vista с указанием параметра lpszFileName
CFileLatinDialog dlg (TRUE, "", "C:\\Models\\" /*lpszFileName */,
   OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
   "Все файлы (*.*)|*.*||", это);

Если вы установите местоположение файла, вы можете открыть диалоговое окно в определенном месте. Я бы использовал это только в том случае, если вам действительно нужно открыть папку или если у вас есть имя файла по умолчанию, которое вы используете.

CFileDialog* filedlg = new CFileDialog(TRUE, (LPCTSTR)NULL,  (LPCTSTR)_T("C:\\MyFolder\\DefaultFileName.ext"), OFN_HIDEREADONLY | OFN_ENABLESIZING, (LPCTSTR)NULL, FromHandle (hImgDlg), 0, FALSE);

или вы можете использовать функцию Windows GetModuleFileName:

CString csAppFolder;
TCHAR szPath[MAX_PATH]; 

// form the path to where we want to store the file
if (GetModuleFileName(NULL, szPath, MAX_PATH))
{
    PathRemoveFileSpec(szPath);
    csAppFolder = szPath;
}

CFileDialog* filedlg = new CFileDialog(TRUE, (LPCTSTR)NULL, (LPCTSTR)(csAppFolder + _T("\\DefaultFileName.ext")), OFN_HIDEREADONLY | OFN_ENABLESIZING, (LPCTSTR)NULL, FromHandle (hImgDlg), 0, FALSE);
Другие вопросы по тегам