1 前言
CFileDialog类可以创建打开/另存为对话框,根据给构造函数传不同的参数决定是哪种对话框,这个类有一个重要的成员变量m_ofn,它是一个OPENFILENAME结构体类型的变量。
2 构造函数
CFileDialog::CFileDialog
CFileDialog(
BOOL bOpenFileDialog, //TURE:打开, FALSE:保存
LPCTSTR lpszDefExt=NULL, //默认扩展名,一般保存时用
LPCTSTR lpszFileName=NULL, //缺省文件名
DWORD dwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, //flags标志,具体可在OPENFILENAME结构体中设置
LPCTSTR lpszFilter=NULL, //过滤器字符串
CWnd* pParentWnd=NULL //父窗口,可为空
);
3 OPENFILENAME结构体
常用的有:
【lpstrFilter】
文件过滤器,可以制定在文件列表中要列出的文件类型。
eg.
fileDlg.m_ofn.lpstrFilter = "Text Files(*.txt)\0*.txt\0PDF Files(*.pdf)\0*.pdf\0All Files(*.*)\0*.*\0\0";
上面制定了三种类型,"Text Files(*.txt)","PDF Files(*.pdf)", "All Files(*.*)"用于在文件类型下拉列表中显示,每个'\0'用于分割,最后有两个'\0'表示结尾, 真正起过滤作用的是"*.txt", "*.pdf", "*.*" 。
【lpstrFile】
*****************************等待完善********************************
【nMaxFile】
*****************************等待完善********************************
【lpstrFileTitle】
对话框顶端栏显示的名字
【flags】
常用的有:
OFN_ALLOWMULTISELECT:允许用户在同一目录下一次选择多个文件
OFN_ENABLEHOOK:允许使用由lpfnHook指定的钩子函数
OFN_EXPLORER:使用explorer对话框样式,默认为有该标志而不管有没有设置这个标志。 只有在钩子处理过程或定制模板使用了OFN_ALLOWMULTISELECT标志时才是需要设置该标志的。
另有不详细介绍,见MSDN
【nFileExtension】
指定从路径开始到通过lpstrFile指定的文件名字符串中扩展名基于0的偏移,以TCHARs为单位。对于ANSI版本,是字节的个数;对于Unicode版本,是字节的个数。例如,如果lpstrFile指向下列的字符串,“c:\dir1\dir2\file.ext”,这个成员包含的值是18。如果用户没有输入一个扩展名并且lpstrDefExt是NULL,这个成员指定的偏移是结束字符NULL。如果用户在文件名中输入一个“.”作为最后的字符,这个成员是0。
【lpstrDefExt】
默认文件后缀,一般保存文件时用,只输入了一个文件名而没有写后缀,用给定的这个默认扩展名作为文件的格式
4 打开对话框实例
void CMy59View::OnFileOpen()
{
static CString strPath = "E:\\Program Files\\Microsoft Visual Studio\\MyProjects"; //初始化路径
CFileDialog fileDlg(TRUE); //打开对话框
fileDlg.m_ofn.lpstrTitle = "打开我的文件"; //标题
fileDlg.m_ofn.lpstrFilter = "Text files(*.txt) \0*.txt\0PDF files(*.pdf) \0*.pdf \0All files(*.*)\0*.*\0\0"; //文件过滤
fileDlg.m_ofn.lpstrInitialDir = strPath; //用strPath初始化对话框打开时的路径
if (IDOK == fileDlg.DoModal())
{
strPath = fileDlg.GetPathName(); //获得文件路径,以便下次使用它来初始化
char *ch = NULL;
CFile file(fileDlg.GetFileName(), CFile::modeRead); //写文件
int len = 0;
len = file.GetLength() / sizeof(char); //获得字符个数
ch = new char[len + 1]; //最好一位写'\0'
ch[len]= '\0';
file.Read(ch, file.GetLength()); //读入文件,单位字节
file.Close();
MessageBox(ch); //显示出读入的内容
CClientDC dc(this);
dc.TextOut(0, 0, ch); //内容写在View上
delete [] ch; //删除ch指向的内存
ch = NULL; //防止出现野指针
}
}
5 另存为对话框实例
void CMy59View::OnFileSave()
{
// TODO: Add your command handler code here
CFileDialog fileDlg(FALSE); //另存为对话框
fileDlg.m_ofn.lpstrTitle = "保存我的文件"; //标题
fileDlg.m_ofn.lpstrFilter = "Text files(*.txt)\0*.txt\0PDF files(*.pdf)\0*.pdf\0All files(*.*)\0*.*\0\0"; //过滤
fileDlg.m_ofn.lpstrDefExt = "txt"; //默认扩展名
if(IDOK == fileDlg.DoModal())
{
CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite); //获得文件名 写文件
char *ch = "I have a dream that one day my four little children will live in a nation where they were\
not judged by the color of their skin but by the content of their character";
file.Write(ch, strlen(ch) * sizeof(char));
file.Close();
}
}
参考资料:http://baike.baidu.com/view/2175167.htm#sub2175167 百度百科 OPENFILENAME