具有实际路径的CFileDialog

时间:2016-11-24 16:24:09

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

我目前正在维护旧的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个,例如编辑audiofiles,用于视频文件),它们都有类似的代码用于打开上面的对话框。

我如何支持CFileDialog的相对路径?

1 个答案:

答案 0 :(得分:0)

CFileDialog支持设置初始/默认文件夹。以下是演示如何使用它的代码段:

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

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

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

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