如何将事件与Cfiledialog联系起来
How to hook an event to CFileDialog?
我正在尝试根据我们从过滤器组合框中选择的文件类型更改默认路径的事件将'保存为'对话框。问题是,我看到的所有示例在结果IDOK
或IDCANCEL
上执行了代码,而我需要在对话框仍打开时要执行代码。
另外,如果过滤器具有相同的类型,是否有任何方法可以区分选择哪些过滤器?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();
}
我的代码使用硬编码路径进行测试目的,但是您现在应该能够完成代码:
- 确定您要基于当前选择的过滤器索引使用的路径。
- 使用与此处类似的逻辑导航到该文件夹。
相关文章:
- 收藏品不会在联系时删除
- 停止与GLIBC的联系,将时间变成__strftime_l
- 将 Boost 与 CMAKE 联系起来时出现问题
- 无法将格鲁与Cmake联系起来
- 包括DLL中的OpenVDB;将错误与Visual Studio 2015联系起来
- 将共享对象库与Eclipse(氧)联系起来
- 如何将事件与Cfiledialog联系起来
- Netezza与C++的联系
- 如何将 Android 项目与 libandroid 与 Cmake 联系起来
- BlackBerry 10与字节阵列联系
- 如何将subdirs lib与qmake联系起来
- 静态联系Intel TBB的问题
- Box2D,联系听众:切勿调用BeginContact
- 将Rust汇编的动态库与GCC联系起来
- 在Ubuntu上使用Eclipse时,将新的第三方库与C 程序联系起来
- UE4包装错误:将问题与OpenSSL联系起来
- 这Microsoft CFileDialog 示例是否会导致潜在的内存冲突
- 如何组织与两个对象有联系的变量
- 为什么 std::atomic_thread_fence 有"C"联系?
- 如何在使用 CFileDialog 打开文件失败时捕获异常