打开文件对话框

 

 

 

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
posted @ 2020-06-03 20:09  Aniston  阅读(289)  评论(0)    收藏  举报