CFileDialog类
CFileDialog封装用于文件打开操作或文件保存操作的常见对话框。信息来源自Windows官方文档:https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfiledialog-class?view=msvc-170
这里重点介绍几个常用的函数功能:
构造函数
explicit CFileDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE);
参数:
1.bOpenFileDialog
[in] 参数,指定要创建的对话框类型。 将其设置为 TRUE 可构造“文件 > 打开”对话框。 将其设置为 FALSE 可构造“文件 > 另存为”对话框。
2.lpszDefExt
[in] 默认的文件扩展名。 如果用户不包含已知扩展名 (在文件名框中) 用户计算机上具有关联的扩展, 则 lpszDefExt 指定的扩展名会自动追加到文件名中。 如果此参数为 NULL,则不会追加任何扩展名。
3.lpszFileName
[in] “文件名”框中显示的初始文件名。 如果为 NULL,则不会显示初始文件名。
4.dwFlags
[in] 一个或多个标志的组合,可用于自定义对话框。 有关这些标志的说明,请参阅 Windows SDK 中的 OPENFILENAME 结构。 如果修改 m_ofn.Flags 结构成员,请在更改中使用按位或运算符以保持默认行为不变。
5.lpszFilter
[in] 一系列字符串对,用于指定可应用于文件的筛选器。 如果指定文件筛选器,则只有与筛选条件匹配的文件才会显示在“文件”列表中。 请参阅“注解”部分,详细了解如何使用文件筛选器。
6.pParentWnd
[in] 一个指针,指向文件对话框的父窗口或所有者窗口。
7.dwSize
[in] OPENFILENAME 结构的大小。 此值取决于操作系统版本。 MFC 使用了此参数来确定要创建的相应对话框类型。 默认大小为 0 表示 MFC 代码将根据运行程序的操作系统版本确定要使用的正确的对话框大小。
8.bVistaStyle
[in] 注意 此参数在 Visual Studio 2008 及更高版本中可用,因此,仅当你在 Windows Vista 或更高版本中运行时,才使用新样式对话框。
指定文件对话框样式的参数。 将其设置为 TRUE 可使用新 Vista 样式文件对话框。 否则将使用旧样式的对话框。 请参阅“注解”部分,详细了解如何在 Vista 下运行。
显示函数
virtual INT_PTR DoModal();
返回值:
IDOK 或 IDCANCEL。 如果返回 IDCANCEL,请调用 Windows CommDlgExtendedError 函数以确定是否发生了错误。
IDOK 和 IDCANCEL 是常量,指示用户选择了“确定”按钮还是“取消”按钮。
返回的INT_PTR是常量,要么是IDOK,要么是IDCANCEL。如果有选中文件,那么就是IDOK,没有选中文件无法定义IDOK。
获取路径名、文件名等信息
if (result == IDOK)//如果有选中文件,那么result就是IDOK
{
CString pathName, fileName, titleName, extName;
pathName = openDlg.GetPathName();//得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
fileName = openDlg.GetFileName();//得到完整的文件名,包括扩展名如:test1.txt
titleName = openDlg.GetFileTitle();//得到完整的文件名,不包括目录名和扩展名如:test1
extName = openDlg.GetFileExt();// 得到完整的文件扩展名,如:txt
MessageBox(pathName + "\r" + fileName + "\r" + titleName + "\r" + extName);//通过显示,注意几者区别
}
如此便成功将选择文件夹信息提取称为了CString。
实战案例
void CMFCCSVSENDDlg::OnBnClickedOpen()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog openDlg(
TRUE,
_T("CLS File(*.csv)|*.csv"),
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("CLS File(*.csv)|*.csv||"),
this
);
INT_PTR result = openDlg.DoModal();//以模态方式创建打开文件对话框
if (result == IDOK)//如果有选中文件,那么result就是IDOK
{
CString pathName, fileName, titleName, extName;
pathName = openDlg.GetPathName();//得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
fileName = openDlg.GetFileName();//得到完整的文件名,包括扩展名如:test1.txt
titleName = openDlg.GetFileTitle();//得到完整的文件名,不包括目录名和扩展名如:test1
extName = openDlg.GetFileExt();// 得到完整的文件扩展名,如:txt
MessageBox(pathName + "\r" + fileName + "\r" + titleName + "\r" + extName);//通过显示,注意几者区别
}
}
效果:
注意:
1.很多时候我们只需要路径和文件名就可以了,所以没有必要非得在串口类里加CFileDialog类。
2.所谓保存,其实也不是CFileDialog存的,这个类确定了一个位置和文件后,需要你手动添加代码实现才行。