打开文件对话框
vc++中打开文件对话框
1. 实现的效果:

2. 对应源代码
auto CHexSampleDlg::OpenFileDlg()const->std::optional<std::vector<std::wstring>>
{
//弹出文件对话框
CFileDialog fd(TRUE, nullptr, nullptr,
OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_DONTADDTORECENT | OFN_ENABLESIZING
| OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, L"All files (*.*)|*.*||");
std::vector<std::wstring> vecFiles { };
if (fd.DoModal() == IDOK)
{
CComPtr<IFileOpenDialog> pIFOD = fd.GetIFileOpenDialog();
CComPtr<IShellItemArray> pResults;
pIFOD->GetResults(&pResults);
DWORD dwCount { };
pResults->GetCount(&dwCount);
for (unsigned i = 0; i < dwCount; i++)
{
CComPtr<IShellItem> pItem;
pResults->GetItemAt(i, &pItem);
CComHeapPtr<wchar_t> pwstrPath;
pItem->GetDisplayName(SIGDN_FILESYSPATH, &pwstrPath);
vecFiles.emplace_back(pwstrPath);
}
}
std::optional<std::vector<std::wstring>> optRet { };
if (!vecFiles.empty())
optRet = std::move(vecFiles);
return optRet;
}
3. 关键步骤说明
CFileDialog是微软提供的一个类,用于设置对话框的样式,定义如下
explicit CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, //lpszDefExt 缺省文件扩展名,用于对话框中文件文件名编辑框中显示。如果为NULL,则不添加扩展名。 LPCTSTR lpszFileName = NULL, //lpszFileName 缺省文件名,若设为NULL,则不添加文件名 DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //可定制对话框。要了解这些标志的描述,可参阅联机文档“Win32 SDK”中的OPENFILENAME结构 LPCTSTR lpszFilter = NULL, //文件过滤,仅显示要求的文件 CWnd* pParentWnd = NULL, //指定文件对话框的父窗口 DWORD dwSize = 0, BOOL bVistaStyle = TRUE);
CComPtr被称为智能指针,是ATL提供的一个模版类,能够从语法上自动完成AddRef和Releas

浙公网安备 33010602011771号