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;
}