文件对话框是在开发程序时经常要用到的一种对话框。在MFC中,可以使用CFileDialog类创建文件对话框,用于文件打开和保存。
CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORDdwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd*pParentWnd = NULL );参数意义如下:bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。一般使用默认风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|DataFiles (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针。
对话框有6个常用的成员函数,用来得到文件名。
GetPathName() 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
GetFileName() 得到完整的文件名,如:test1
GetExtName() 得到完整的文件扩展名,如:txt
GetFileTitle( ) 得到完整的文件名,包括目录名和扩展名如:test1.txt
还有两个函数,用于选取了多个文件时使用。POSITIONCFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
GetNextPathName(POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。
一个简单的例子。1、首先用VC建一个简单的对话框工程,添加一些空间。暂时不用写任何代码,可得到如下效果。
2、按钮控件,单击函数下面添加代码如下:
void CFileDlgDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString PathName; // 定义四个变量,分别保存完整路径名、文件名、后缀名和文件标题
CString FileName;
CString ExtName;
CString FileTitle;
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "All File(*.*)|*.*|Text File(*.txt)|*.txt||", AfxGetMainWnd());
if (dlg.DoModal() == IDOK){
PathName = dlg.GetPathName(); // 调用成员函数,分别获取这四个名字
FileName = dlg.GetFileName();
ExtName = dlg.GetFileExt();
FileTitle= dlg.GetFileTitle();
SetDlgItemText( IDC_EDIT1, PathName); //设置编辑框中的内容
SetDlgItemText( IDC_EDIT2, FileName);
SetDlgItemText( IDC_EDIT3, ExtName);
SetDlgItemText( IDC_EDIT4, FileTitle);
}
}
3、编译,链接,执行。效果如下:
整个工程文件链接地址:http://pan.baidu.com/s/1dDpMjxJ
CFileDialog中的风格dwFlag参数,可以指定打开的方式风格。例如,添加OFN_ALLOWMULTISELECT参数,可以同时选择多个文件。关于更多其他的风格,可以参考帮助文档。选取了多个文档,就需要使用后面的两个成员函数来依次获取每个文件了。一个简单的例子:
int retval = dlg.DoModal();
if(retval==IDCANCEL)
return false;
POSITION pos_file;
pos_file = dlg.GetStartPosition();
CArray<CString, CString> ary_filename;
while(pos_file != NULL)
ary_filename.Add(dlg.GetNextPathName(pos_file));
参考资料:
CFileDialog用法简介:http://blog.youkuaiyun.com/demok2010/article/details/5957523
Visual C++程序设计自学手册
零基础学Visual C++