如何将事件挂接到CFileDialog?

时间:2019-07-01 07:45:46

标签: c++ mfc cfiledialog

我正在尝试创建一个“另存为”对话框,该事件将根据我们从过滤器组合框中选择的文件类型来更改默认路径。问题是,我见过的所有示例都在结果IDOKIDCANCEL上执行代码,而我仍需要在对话框仍打开的情况下执行代码。

此外,如果过滤器具有相同的类型,是否有任何方法可以区分选择了哪个过滤器? GetFileExt()方法仅返回扩展名,但我无法确定它是第一个.my过滤器还是模板.my过滤器。

我见过类似LPOFNHOOKPROC之类的东西,但是没有任何示例说明我将如何使用它,并且不确定它是否能解决我的问题。

void CMyClass::OnFileOpen()
{
   CString pathNam;
   CString fileName;

   TCHAR szFilters[]= _T("MyType Files (*.my)|*.my|"Template MyType (*.my)|*.my||");

   CFileDialog fileDlg(TRUE, _T("my"), _T("*.my"),
   OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);

   if(fileDlg.DoModal() == IDOK)
   {
       pathName = fileDlg.GetPathName();
       fileName = fileDlg.GetFileTitle();
   }
}

编辑:

我现在可以通过获取OFN并检查nFilterIndex值来获取选择的特定过滤器。所以剩下的问题是我是否可以根据所选的文件格式更新路径?

EDIT2:

我找到了OnChangeType方法并将其重载到子类中,并且确实在其中执行了该方法和代码,但是当我尝试更新文件路径时,出现访问冲突:

void TFileDialogExt::OnTypeChange()
{
   LPWSTR buff = L"C:\\TEST\\template.my";

   if(m_pOFN->nFilterIndex == 2)
      m_ofn.lpstrFile = buff;    
}

1 个答案:

答案 0 :(得分:1)

基本上,您必须继承CFileDialog的子类并处理其CFileDialog::OnTypeChange方法。

但是,正如Microsoft所建议的那样:您最好改用新的Common Item Dialog