前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vc++保存和另存为对话框,打开文件对话框

vc++保存和另存为对话框,打开文件对话框

作者头像
大菊观
发布2023-10-16 15:45:04
1990
发布2023-10-16 15:45:04
举报

windows上保存时常用的两个弹窗,一个是选择路径去保存,适用于选择目录,弹窗如图:

 实现代码:

代码语言:javascript
复制
//需要添加头文件
//#include <Shlobj.h>	
//#pragma comment(lib,"shell32.lib")
    BROWSEINFO sInfo;
	::ZeroMemory(&sInfo,sizeof(BROWSEINFO));
	sInfo.pidlRoot = 0;
	sInfo.lpszTitle = _T("选择路径");
	sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
	sInfo.lpfn = NULL;
	LPITEMIDLIST lpidlBrowse = SHBrowseForFolder(&sInfo);

	wchar_t pszPath[1024] = {0};
	::SHGetPathFromIDList(lpidlBrowse,pszPath);

另一个是保存到文件的弹窗,常用于另存为,弹窗如图

实现代码:

代码语言:javascript
复制
//需要添加头文件
//#include <commdlg.h>	
//#pragma comment(lib,"comdlg32.lib")
		OPENFILENAME ofn;
		ZeroMemory(&ofn, sizeof(ofn));

		TCHAR szFilename[MAX_PATH] = {0};
		ofn.lpstrFile		  = szFilename;
		ofn.nMaxFile		  = MAX_PATH;
		ofn.lpstrFilter		  = _T("Text Files(.txt)\0*.txt\0Image Files(.png;jpg;.bmp)\0*.png;*.jpg;*.bmp\0All Files(*.*)\0*.*\0\0");
		ofn.lpstrDefExt		  = _T("txt");
		ofn.lpstrTitle		  = _T("Save To");
		ofn.Flags			  = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
		ofn.lStructSize		  = sizeof(OPENFILENAME);  // No OFN_ENABLEHOOK
		ofn.hwndOwner		  = hWnd;
		if (GetSaveFileName(&ofn))
		{
			::MessageBoxW(hWnd,szFilename,_T("路径"),MB_OK);
		}

 接下来是选择打开文件时的弹窗:(截图就不放了,和另存为那个差别不大)

代码语言:javascript
复制
//XP系统就可用
//需要添加头文件
//#include <commdlg.h>	
//#pragma comment(lib,"comdlg32.lib")	
	TCHAR szFilename[1024] = { 0 }; 
	OPENFILENAME ofn = { 0 };  
	ofn.lStructSize = sizeof(OPENFILENAME);
	ofn.lpstrFilter = _T("所有文件\0*.*\0可执行程序\0*.exe;*.bat\0\0");	//设置过滤  
	ofn.nFilterIndex = 1;
	ofn.lpstrFile = szFilename;
	ofn.nMaxFile = sizeof(szFilename);
	ofn.lpstrInitialDir = NULL; 
	ofn.lpstrTitle = TEXT("请选择可执行程序路径"); 
	ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NODEREFERENCELINKS;
	ofn.hwndOwner = hWnd;
	if (GetOpenFileName(&ofn))  
	{   
		::MessageBoxW(hWnd,szFilename,_T("路径"),MB_OK);
	}

还有一种在win7及win7以后系统的系统中用的代码:

代码语言:javascript
复制
//需要添加头文件
//#include <objbase.h>
//#include <Shlobj.h>	
//#pragma comment(lib,"shell32.lib")	
	wstring wstrFilePath;	
	IFileDialog *pfd = NULL;
	HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));// 创建com对象
	if (SUCCEEDED(hr))
	{
		DWORD dwFlags;
		hr = pfd->GetOptions(&dwFlags);
		hr = pfd->SetOptions(dwFlags | FOS_FORCEFILESYSTEM | FOS_NODEREFERENCELINKS);
		COMDLG_FILTERSPEC fileType[] =
		{
			{ L"All files", L"*.*" },
		};
		hr = pfd->SetFileTypes(ARRAYSIZE(fileType), fileType);
		hr = pfd->Show(NULL);
		//hr = pfd->SetDefaultExtension(L"exe");
		if (SUCCEEDED(hr))
		{
			IShellItem *pSelItem;
			hr = pfd->GetResult(&pSelItem);
			if (SUCCEEDED(hr))
			{
				LPWSTR pszFilePath = NULL;
				hr = pSelItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszFilePath);
				wstrFilePath = pszFilePath;
				CoTaskMemFree(pszFilePath);
			}
			if (pSelItem)
				pSelItem->Release();
		}
	}

	if (pfd)
		pfd->Release();

	::MessageBoxW(hWnd,wstrFilePath.c_str(),_T("路径"),MB_OK);;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档