【问题标题】:CFileDialog with realtive path具有相对路径的 CFileDialog
【发布时间】:2016-11-24 16:24:08
【问题描述】:

我目前正在维护一个旧的 MFC 应用程序,但在打开文件对话框时遇到了问题。该程序有多个不同的部分,用户选择要加载的文件,例如声音、视频和其他程序特定格式。

打开对话框应始终在“特定”文件夹中打开,具体取决于文件结尾。提供包含“..\”的目录路径将被接受,对话框将打开并显示“最后选择的文件”。

CString fileDirectory = myHelper.getPath();
// fileDirectory  is now "C:\coding\svn\source\MyProgram\..\..\bin\..\data\..\Audio\"
CFileDialog FileDialog(true, _T("MP3;WAV"), _T(fileDirectory), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T("All music files (*.WAV;*.MP3)));

if (FileDialog.DoModal() == IDOK)
{ ... }

我使用不同的 CDialog 类(大约 15 个,例如用于编辑音频文件、用于视频文件),它们都有类似的代码来打开上述对话框。

如何支持 CFileDialog 的相对路径?

【问题讨论】:

  • 您是如何得出结论的,CFileDialog 不支持相对路径?

标签: c++ winapi mfc dialog modal-dialog


【解决方案1】:

CFileDialog 支持设置初始/默认文件夹。这是演示如何使用它的代码sn-p:

    const TCHAR szFilter[] = _T("Parameter Files (*.npf)|*.npf|All Files (*.*)|*.*||");
    CFileDialog dlg(TRUE, _T("npf"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this); 
    CString sParametersDir(CUtility::GetParametersDir());
    dlg.m_ofn.lpstrInitialDir = sParametersDir.GetBuffer(_MAX_PATH);    
    if(dlg.DoModal() == IDOK)
    {
        m_ParametersFileEdit.SetWindowText(dlg.GetPathName());
    }

    sParametersDir.ReleaseBuffer();

还有关于您的代码。 CString 对象无需使用 _T() 宏。 CString 类确实自动支持 UNICODE。 _T() 宏只能用于字符串文字。

您可以使用CPath 类来规范化文件路径。

CPath path(sPath);
path.AddBackslash();
path.Append(_T("Config"));
path.Canonicalize();

【讨论】:

  • “没有必要为CString 对象使用_T() 宏。” - 事实上,如果它完全编译,那么你还没有定义@ 987654333@ 预处理器符号。虽然在真正的旧代码中很常见,但请考虑切换到 Unicode。
  • 根据CFileDialog documentation:“Windows Vista 样式的文件对话框不支持 CFileDialog 的某些成员和标志。因此,这些将无效。”@ 987654335@ 在被忽略的字段列表中。
  • OPENFILENAME documentation 描述了lpstrInitialDir 在各种操作系统版本上的实际行为。最重要的是,lpstrInitialDir可以被忽略,而使用用户最后选择的目录。
  • @RemyLebeau CFileDialog 的文档一定是错误的。 CFileDialog 将接受 lpstrInitialDir 并将其发送给 IFileDialog::SetFolder。但是,如果还提供了带有完整路径的文件名,则会忽略 lpstrInitialDir,在这种情况下,将使用该文件的文件夹(在这种情况下,没有默认文件名)
猜你喜欢
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2016-08-03
  • 2011-07-30
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多