方式一:ufun函数
/*-------------文件保存对话框----------------*/
//方式一: UFUN函数
char* prompt_string = "保存";//标准提示文本
char* title_string = "保存";//文件对话框标题
char* FILTER_STRING = ".txt";//指定文件类型
char* DEFAULT_NAME = "test.txt";//默认文件名,用于初始化选择
char* filename;//用户选择的文件名
int nResponse;//对话框响应 UF_UI_OK: 确定 UF_UI_CANXEL: 取消
UF_UI_create_filebox(prompt_string, title_string, FILTER_STRING, DEFAULT_NAME, filename, &nResponse);
if (nResponse == UF_UI_OK)
{
print(filename, 1);//打印保存的的文件名
}
else
{
print("用户选择了取消", 1);
}
运行结果如下所示:
缺点:该函数不支持多种文件类型的选择 。如果有需要,可以使用ug10.0及其以上的版本中的ufun函数UF_UI_create_filebox_with_multiple_filters,具体不作讲解。
方式二:Windows API
//方式二: widows API
OPENFILENAME ofn; // 公共对话框结构
TCHAR szFile[MAX_PATH]; // 保存获取文件名称的缓冲区
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = ".xls\0*.xls\0.xlsm\0*.xlsm\0"; //过滤规则
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = ""; //指定默认路径
ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
if (GetSaveFileName(&ofn))
{
return ofn.lpstrFile;//返回文件名
}
else
{
return "";
}
运行结果如下所示:
需要注意的是: 首先需要在代码中添加Windows.h头文件,其次需要链接所需的库文件----在项目属性中设置链接器中附属依赖项添加comdlg32.lib。
缺点:该文件对话框比较落后,无法获取文件后缀名,同时无法设置默认文件名,不推荐使用。
方式三:MFC CFileDialog类
//方式三: MFC CFileDialog类
// 构造保存文件对话框
BOOL bOpenFileDialog;//指定要创建的文件对话框的类型。设为TRUE将创建打开文件对话框,FALSE为创建保存文件对话框。
LPCTSTR lpszDefExt = L".xls";//默认的文件扩展名
LPCTSTR lpszFileName = L"默认文件名";//文件名编辑框中显示的初始文件名。如果为NULL,则不显示初始文件名。
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
TCHAR szFilter[] = _T("Excel文件(*.xls)|*.xls|Excel 2007 启用宏的工作簿(*.xlsm)|*.xlsm|");//设置文件选择类型
CFileDialog fileDlg(FALSE, lpszDefExt, lpszFileName, dwFlags, szFilter);
string strFilePath;
// 显示保存文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“保存”按钮,则将选择的文件路径显示到编辑框里
//strFilePath = fileDlg.GetPathName();//绝对路径
//print(strFilePath, 2);
//strFilePath = fileDlg.GetFileName();//文件名加后缀
//print(strFilePath, 2);
//strFilePath = fileDlg.GetFileExt();//文件类型->后缀
//print(strFilePath, 2);
//strFilePath = fileDlg.GetFileTitle();//文件名不带后缀
//print(strFilePath, 2);
}
else
{
strFilePath = "";
}
运行结果如下所示:
值得注意的是:
添加头文件afxdlgs.h,且一定要添加在所有包含了宏_WINDOWS_的头文件的前面,如果还是出现重复包含Windows.h头文件,可以删除项目属性里的预处理器定义中的_USRDLL。