如何将事件与Cfiledialog联系起来

How to hook an event to CFileDialog?

本文关键字:Cfiledialog 联系 起来 事件      更新时间:2023-10-16

我正在尝试根据我们从过滤器组合框中选择的文件类型更改默认路径的事件将'保存为'对话框。问题是,我看到的所有示例在结果IDOKIDCANCEL上执行了代码,而我需要在对话框仍打开时要执行代码。

另外,如果过滤器具有相同的类型,是否有任何方法可以区分选择哪些过滤器?GetFileExt()方法只是返回扩展名,但我无法分辨它是第一个.My Filter或Template .My Filter。

我已经看过类似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;    
}

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

,但是,正如微软所建议的:您最好使用一个新的公共项目对话框。

我对此进行了一些研究,并找到了一些有用的问题:

  • 在编程中使用ifiledialog在C 中进行预选
  • 如何将shcreateitemfromparsingname与shell名称空间的名称使用?

另外,请查看:SHCreateItemFromParsingName


这是一个示例OnTypeChange处理程序:

void CMyFileDialog::OnTypeChange()
{
    {
        IFileOpenDialog* pfod = NULL;
        HRESULT hr = (static_cast<IFileDialog*>(m_pIFileDialog))->QueryInterface(IID_PPV_ARGS(&pfod));
        if (SUCCEEDED(hr))
        {
            IShellItem* psiInitialDir;
            CString strFolder = L"d:\";
            hr = SHCreateItemFromParsingName(strFolder.GetString(), NULL, IID_PPV_ARGS(&psiInitialDir));
            if(SUCCEEDED(hr))
            {
                pfod->SetFolder(psiInitialDir);
            }
        }
    }
    CFileDialog::OnTypeChange();
}

我的代码使用硬编码路径进行测试目的,但是您现在应该能够完成代码:

  1. 确定您要基于当前选择的过滤器索引使用的路径。
  2. 使用与此处类似的逻辑导航到该文件夹。