<Win32 API> 打开/保存文件, 选择目录 GetOpenFileName

1. 打开文件

使用OPENFILENAME结构体( 官网文档), 调用GetOpenFileName获取。
示例代码如下:
//
// 打开文件
BOOL OpenFile(wstring &strPath)
{ 
	wchar_t szPathName[MAX_PATH] = {0};
	OPENFILENAME ofn = { OPENFILENAME_SIZE_VERSION_400 };//or  {sizeof (OPENFILENAME)}  
	ofn.hwndOwner = GetForegroundWindow();			// 拥有者句柄	
	// 过滤器,以\0相隔: 显示名称\0过滤器\0显示名称\0过滤器\0\0
	ofn.lpstrFilter = TEXT("Xml文件(*.xml)\0*.xml\0所有文件(*.*)\0*.*\0\0");
	ofn.lpstrFile = szPathName;				// 存放用户选择文件的 路径及文件名 缓冲区 
	ofn.nMaxFile = sizeof(szPathName);		// 缓冲区大小,单位为字节,至少256
	ofn.lpstrTitle = TEXT("选择文件");		// 选择文件对话框标题  
	ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST /*| OFN_ALLOWMULTISELECT 允许选择多个文件*/;

	BOOL bOk = GetOpenFileName(&ofn);
	if (!bOk)  
	{  
		return FALSE;
	} 
	wcout.imbue(locale("chs"));
	wcout << L"选择文件: " << szPathName << endl;
	strPath = szPathName;

	return TRUE;
}

2. 保存文件

调用GetSaveFileName获取路径,示例代码如下:
//
// 保存文件
BOOL SaveFile(wstring &strPath)
{
	wchar_t szPathName[MAX_PATH] = {0};
	OPENFILENAME ofn = { OPENFILENAME_SIZE_VERSION_400 };//or  {sizeof (OPENFILENAME)}  
	ofn.hwndOwner = GetForegroundWindow();			// 拥有者句柄	
	wcscpy_s(szPathName, TEXT("new.xml"));		// 定义预先的存储文件名
	ofn.lpstrFilter = TEXT("Xml文件(*.xml)\0*.xml\0所有文件(*.*)\0*.*\0\0");
	ofn.lpstrFile = szPathName;
	ofn.nMaxFile = sizeof(szPathName);
	ofn.lpstrTitle = TEXT("保存文件");
	ofn.Flags = OFN_OVERWRITEPROMPT;		// 覆盖提示

	BOOL bOk = GetSaveFileName(&ofn);
	if (!bOk)
	{
		return FALSE;
	}
	wcout.imbue(locale("chs"));
	wcout << L"保存文件: " << szPathName << endl;
	
	strPath = szPathName;

	return TRUE;
}

3. 选择目录

使用BROWSEINFO结构体( 官网文档),调用SHBrowseForFolder,SHGetPathFromIDList进行目录路径获取。
示例代码如下:
BOOL SelectDir(HWND hWnd, wstring &strPath)
{
	BROWSEINFO bifolder;
	wchar_t FileName[MAX_PATH];
	ZeroMemory(&bifolder, sizeof(BROWSEINFO)); 
	bifolder.hwndOwner = hWnd;				// 拥有者句柄
	bifolder.pszDisplayName = FileName;		// 存放目录路径缓冲区
	bifolder.lpszTitle = TEXT("请选择文件夹");	// 标题
	bifolder.ulFlags = BIF_NEWDIALOGSTYLE | BIF_EDITBOX; // 新的样式,带编辑框

	LPITEMIDLIST idl = SHBrowseForFolder(&bifolder);
	if (idl == NULL)
	{
		return FALSE;
	}

	SHGetPathFromIDList(idl,FileName);    
	strPath = FileName;
	wcout.imbue(locale("chs"));
	wcout << L"所选目录: " << strPath << endl;
	return TRUE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值