Начальный каталог не работает для 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 *****/
}

5

Решение

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

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

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

4

Другие решения

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

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);
5

Два варианта:
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,
"Все файлы (*. *) | *. * ||", это);
3