c++ - 如何将事件挂钩到 CFileDialog?
问题描述
我正在尝试使用一个事件创建一个“另存为”对话框,该事件将根据我们从过滤器组合框中选择的文件类型更改默认路径。问题是,我看到的所有示例都在结果上执行代码,IDOK
或者IDCANCEL
我需要在对话框仍然打开时执行代码。
此外,如果过滤器具有相同的类型,是否有任何方法可以区分选择的过滤器?该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
值来获取已选择的特定过滤器。所以剩下的问题是我是否可以根据选择的文件格式更新路径?
编辑2:
我找到了该OnChangeType
方法并在子类中重载了它,它确实执行了该方法和其中的代码,但是当我尝试更新文件路径时,我遇到了访问冲突:
void TFileDialogExt::OnTypeChange()
{
LPWSTR buff = L"C:\\TEST\\template.my";
if(m_pOFN->nFilterIndex == 2)
m_ofn.lpstrFile = buff;
}
解决方案
基本上你必须继承CFileDialog
并处理它的CFileDialog::OnTypeChange
方法。
但是,正如 Microsoft 所建议的:您最好改用新的Common Item Dialog。
推荐阅读
- excel - 如何根据excel中的相邻单元格设置类型持续时间的数据栏
- c++ - 如何为环面创建索引
- ios - iOS 操作扩展,从 Safari 共享 PDF 失败
- r - 在R中使用马氏距离最近邻匹配进行子分类
- kubernetes - Kubernetes 无法访问多工作节点中的 pod
- ios - Info.plist 中 CFBundleDocumentTypes 键的值必须是字典数组
- javascript - 我如何检测 iframe 视频是否不起作用
- assembly - 在汇编程序中将整数运算的结果转换为十进制
- matlab - 如何在 Matlab R2018b 中使用图像上的 4 个角绘制矩形?
- python - 如何获取列表中的完整元素名称