【问题标题】:MFC CFileDialog and lpstrInitialDirMFC CFileDialog 和 lpstrInitialDir
【发布时间】:2015-12-16 18:08:53
【问题描述】:

根据OPENFILENAME structure的文档,使用以下算法选择初始目录:

Windows 7:

  1. 如果 lpstrInitialDir 的值与应用程序第一次使用 打开另存为 对话框时传递的值相同,则路径最用户最近选择的用作初始目录。
  2. 否则,如果 lpstrFile 包含路径,则该路径是初始目录。
  3. 否则,如果lpstrInitialDir不为NULL,则指定初始目录。
  4. 如果 lpstrInitialDirNULL 且当前目录包含指定过滤器类型的任何文件,则初始目录为当前目录。
  5. 否则初始目录为当前用户的个人文件目录。
  6. 否则初始目录为桌面文件夹。

我正在使用以下代码来构建文件对话框:

CFileDialog dlgFile(bOpenFileDialog);
dlgFile.m_ofn.lpstrInitialDir = strSourcePath;
dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);

但是,它总是在 strSourcePath 中打开相同的默认文件夹。有谁知道为什么?它应该只第一次使用这个目录,随后打开的文件应该记住最后一个文件夹(算法中的要点 1.)。我在 Windows 7 上使用 VS2012。

【问题讨论】:

  • 文档似乎有冲突。虽然OPENFILENAME 包含问题中复制的算法,但CFileDialog::m_ofn 建议使用Windows Vista 样式对话框时不支持lpstrInitialDir

标签: mfc cfiledialog


【解决方案1】:

这里是修复:

dlgFile.m_ofn.lpstrInitialDir = strSourcePath.GetBuffer(_MAX_PATH);

完成后别忘了致电strSourcePath.ReleaseBuffer();

如果您使用lpstrFile 指定文件名,那么您可能需要在文件名前添加初始目录路径。

【讨论】:

  • 对不起,忘记添加...strSourcePath 是一个 CString strSourcePath; strSourcePath = "C:\\文件夹名";
  • 这并不能解决任何问题。 CString 有一个隐式的 LPCTSTR 转换运算符(如问题中所用)。 lpstrInitialDir 的类型为 LPCTSTR。无缘无故地传递指向可修改字符串的指针是错误的。我不知道,为什么你认为这是一个解决方案。
猜你喜欢
  • 2023-03-07
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2013-02-01
  • 2011-10-25
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多