CFileDialog类用来创建“打开文件”对话框或者“另存为”对话框,如图1所示。
图1 “打开文件”对话框
CFileDialog类派生自CCommonDialog类,CCommonDialog类派生自CDialog类。
1 CFileDialog对话框的显示
通过CFileDialog类的构造函数实现对象的创建。
1.1 CFileDialog类的构造函数
CFileDialog类的构造函数格式为
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);
其中,构造函数的参数bOpenFileDialog表示显示的对话框的类型,TRUE表示显示“打开文件”对话框,FALSE表示显示“另存为”对话框;lpszDefExt表示文件的默认扩展名,如果用户不输入扩展名,该扩展名则自动添加在文件名后;lpszFileName表示最初出现在对话框中“文件名(N)”框中的内容;dwFlags是位标志,指定了对话框的属性,默认值OFN_HIDEREADONLY表示将默认方式下出现在对话框中的只读复选框隐藏起来,OFN_OVERWRITEPROMPT表示“另存为”对话框时,如果另存的文件存在,则弹出提示对话框;lpszFilter指向一个字符串,该字符串指定选择的文件类型;pParentWnd表示该对话框的父窗口指针;dwSize是OPENFILENAME结构的大小,该结构包含了创建的对话框的属性;bVistaStyle指定了是否具有Vista类型。
TCHAR filters[] = _T("Source File(*.txt)|*.txt|Source File(*.ini)|*.ini||");
CFileDialog dlg(TRUE, _T("txt"), _T("*.txt"), OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, filters);
if(dlg.DoModal() == IDOK)
{
m_ctl_source_file.SetWindowTextW(dlg.GetPathName());
}
通过CFileDialog
类的构造函数创建对话框的代码中,
filters
是
TCHAR
的指针,表示要打开文件的类型。
filters
由两个“字符串对”组成,分别是
Source File(*.txt)|*.txt
和
Source File(*.ini)|*.ini
。其中字符串对中的第一个字符串对
filter
进行了描述,而第二个字符串指定了文件的扩展名。字符串最后用两个’|’
表示结束。如图2
所示,加红框的位置为
filters
的两个“字符串对”中第一个字符串,即对
filter
的描述,当选中某个
filter
的描述后,只能打开“字符串对”中第二个字符串指定类型的文件。例如,选择
Source File(*.txt)
,则只能打开
txt
文件,而选择
Source File(*.ini)
只能打开
ini
文件。
图2 filters的作用
CFileDialog类的构造函数的第三个参数对应图3中红框的内容。
图3 默认文件名
第四个参数中,OFN_FILEMUSTEXIST要求对话框检测用户输入的文件名,如果文件不存在,则拒绝文件名,OFN_HIDEREADONLY的作用之前已经讲过;第五个参数表示要打开文件的类型。
通过CFileDialog类的对象dlg调用DoModal()函数显示对话框。当按下了图1显示的对话框中的“打开(O)”按键后,DoModal()函数返回值是IDOK。
1.2 显示在“打开文件”对话框中选定的文件的绝对路径
m_ctl_source_file是编辑框控件的对象,该编辑框用来显示在“打开文件”对话框中选定的文件的绝对路径。GetPathName()函数是CFileDialog类的成员函数,该函数的作用是返回选中对话框的绝对路径。除了GetPathName()函数外,CFileDialog类的GetFileName()函数返回带后缀名的文件名,而GetFileTitle()函数返回不带后缀名的文件名。
2 CFileDialog对话框属性的修改
MFC的CFileDialog类封装了OPENFILENAME结构和两个Windows API函数- GetOpenFileName()和GetSaveFileName()。OPENFILENAME结构中包含了要显示的对话框的属性,GetOpenFileName()函数用来显示“打开文件”对话框,GetSaveFileName()函数用来显示“另存为”对话框。
在“1.1 CFileDialog类的构造函数”,用CFileDialog构造对话框时,该类构造函数将用来定义对话框窗口标题、初始目录和其它参数的值填充在OPENFILENAME结构的相应域中。随后将结构的地址传递给GetOpenFileName()函数或GetSaveFileName()函数。用来初始化结构的值中,一些来自CFileDialog类的构造函数的参数表,其它则是适用于大多数应用程序的默认值。
可以在调用CFileDialog类的构造函数创建该类的对象之后,而在调用DoModal()函数显示对话框之前,修改OPENFILENAME结构中的相应成员变量,来修改对话框的属性。
CFileDialog类的成员变量m_ofn是OPENFILENAME结构的变量。在该结构中,lpstrFileTitle表示对话框的标题,lpstrInitialDir表示“打开文件”对话框最开始显示的文件夹。
dlg.m_ofn.lpstrTitle = _T("请选择要打开的文件!");
dlg.m_ofn.lpstrInitialDir = _T("D:\\文件");
以上代码将“打开文件”对话框的标题设置为“请选择要打开的文件”,对话框最开始显示的文件夹是
D
盘根目录下名为“文件”的文件夹中的内容,如图
4
所示。
图4 修改属性后的“打开文件”对话框