孙鑫 第十二课之三 CFileDialog 打开/保存对话框

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结构体

孙鑫 第十二课之三 CFileDialog 打开/保存对话框 - 大灰狼 - 大灰狼 的博客

常用的有:

【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

孙鑫 第十二课之三 CFileDialog 打开/保存对话框 - 大灰狼 - 大灰狼 的博客



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值