文档章节

CFileDialog:文件对话框

Amamatthew
 Amamatthew
发布于 2014/06/14 15:54
字数 1862
阅读 37
收藏 0

     本节讲解文件对话框。文件对话框也是很常用的一类对话框。
     文件对话框的分类
     文件对话框分为打开文件对话框和保存文件对话框,大家在Windows系统中经常见到这两种文件对话框。

     例如,很多像记事本等编辑软件都有“打开”选项,选择“打开”后会弹出一个对话框,让我们选择要打开文件的路径,这个对话框就是打开文件对话框;除了“打开”选项一般还会有“另存为”选项,选择“另存为”后往往也会有一个对话框弹出,让我们选择保存的路径,这个就是保存文件对话框。
       正如上面举例说明的,打开文件对话框用于选择要打开的文件的路径,保存文件对话框用来选择要保存的文件的路径。
       文件对话框类CFileDialog
       MFC使用文件对话框类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将创建打开文件对话框,否则将创建保存文件对话框。
       lpszDefExt:默认的文件扩展名。如果用户在文件名编辑框中没有输入扩展名,则由lpszDefExt指定的扩展名将被自动添加到文件名后。默认为NULL。
       lpszFileName:文件名编辑框中显示的初始文件名。如果为NULL,则不显示初始文件名。
       dwFlags:文件对话框的属性,可以是一个值也可以是多个值的组合。关于属性值的定义,可以在MSDN中查找结构体OPENFILENAME,元素 Flags的说明中包含了所有属性值。默认为OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT的组 合,OFN_HIDEREADONLY表示隐藏文件对话框上的“Read Only”复选框,OFN_OVERWRITEPROMPT表示在保存文件对话框中如果你选择的文件存在了,就弹出一个消息对话框,要求确定是否要覆盖此 文件。
       lpszFilter:文件过滤器,它是由若干字符串对组成的一个字符串序列。如果指定了文件过滤器,则文件对话框中只有符合过滤条件的文件显示在文件列表中待选择。

给大家看看VS2010 MSDN中给出的一个例子:

 static TCHAR BASED_CODE szFilter[] = _T("Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||");

       这样设置过滤器以后,文件对话框的扩展名组合框中将有四个选项:Chart Files (*.xlc)、Worksheet Files (*.xls)、Data Files(*.xlc;*.xls)和All Files (*.*),大家可以看到每种文件的扩展名规定都是一个字符串对,例如Chart Files的过滤字符串是Chart Files(*.xlc)和*.xlc成对出现的。
       pParentWnd:文件对话框的父窗口的指针。
       dwSize:OPENFILENAME 结构体的大小。不同的操作系统对应不同的dwSize值。MFC通过此参数决定文件对话框的适当类型(例如,创建Windows 2000文件对话框还是XP文件对话框)。默认为0,表示MFC将根据程序运行的操作系统版本来决定使用哪种文件对话框。
       bVistaStyle:指定文件对话框的风格,设为TRUE则使用Vista风格的文件对话框,否则使用旧版本的文件对话框。此参数仅在Windows Vista中编译时适用。
       文件对话框也是模态对话框,所以在打开时也需要调用CFileDialog类的DoModal()成员函数。在打开文件对话框中点了“打开”或者在保存文 件对话框中点了“保存”以后,我们可以使用CFileDialog类的成员函数GetPathName()获取选择的文件路径。
       下面列出几个CFileDialog类的成员函数,我们可以使用它们获得文件对话框中的各种选择。

GetFileExt()      :获得选定文件的后缀名。
GetFileName()     :获得选定文件的名称,包括后缀名。
GetFileTitle()    :获得选定文件的目录。
GetNextPathName() :获得下一个选定的文件的路径全名。
GetPathName()     :获得选定文件的路径全名。
GetReadOnlyPref() :获得是否“以只读方式打开”。
GetStartPosition():获得文件名列表中的第一个元素的位置。

      根据前面所讲内容,鸡啄米给大家做个文件对话框实例。
       1.创建一个基于对话框的MFC应用程序工程,名称设为“Example17”。
       2.修改主对话框IDD_EXAMPLE17_DIALOG的模板,删除自动生成的“TODO: Place dialog controls here.”静态文本框,添加两个编辑框,ID分别为IDC_OPEN_EDIT和IDC_SAVE_EDIT,再添加两个按钮,ID分别设为 IDC_OPEN_BUTTON和IDC_SAVE_BUTTON,Caption分别设为“打开”和“保存”。
       按钮 IDC_OPEN_BUTTON用于显示打开文件对话框,编辑框 IDC_OPEN_EDIT显示在打开文件对话框中选择的文件路径。按钮 IDC_SAVE_BUTTON用于显示保存文件对话 框,编辑框 IDC_SAVE_BUTTON显示在保存文件对话框中选择的文件路径。
       3.分别为按钮 IDC_OPEN_BUTTON和 IDC_SAVE_BUTTON添加点击消息的消息处理函数CExample17Dlg::OnBnClickedOpenButton()和CExample17Dlg::OnBnClickedSaveButton()。
       4.修改两个消息处理函数如下

void CExample17Dlg::OnBnClickedOpenButton()   
{   
    // TODO: Add your control notification handler code here   
    // 设置过滤器   
    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");   
    // 构造打开文件对话框   
    CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);   
    CString strFilePath;   
  
    // 显示打开文件对话框   
    if (IDOK == fileDlg.DoModal())   
    {   
        // 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里   
        strFilePath = fileDlg.GetPathName();   
        SetDlgItemText(IDC_OPEN_EDIT, strFilePath);   
    }   
}   
  
void CExample17Dlg::OnBnClickedSaveButton()   
{   
    // TODO: Add your control notification handler code here   
    // 设置过滤器   
    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||");   
    // 构造保存文件对话框   
    CFileDialog fileDlg(FALSE, _T("doc"), _T("my"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);   
    CString strFilePath;   
  
    // 显示保存文件对话框   
    if (IDOK == fileDlg.DoModal())   
    {   
        // 如果点击了文件对话框上的“保存”按钮,则将选择的文件路径显示到编辑框里   
        strFilePath = fileDlg.GetPathName();   
        SetDlgItemText(IDC_SAVE_EDIT, strFilePath);   
    }   
}

      上面显示编辑框内容时,鸡啄米使用了Windows API函数SetDlgItemText,当然也可以先给编辑框关联变量,然后再使用鸡啄米在创建对话框类和添加控件变量中介绍的
CDialogEx::UpdateData()函数,但是鸡啄米比较习惯使用SetDlgItemText函数,感觉比较灵活。

       5.运行此程序,在结果对话框上点“打开”按钮,显示打开文件对话框如下:

       点“保存”按钮后,显示保存文件对话框:

VS2010/MFC编程入门之十七(对话框:文件对话框)

       在打开文件对话框和保存文件对话框都选择了文件路径后,主对话框如下:

VS2010/MFC编程入门之十七(对话框:文件对话框)

       到此,文件对话框就讲完了,是不是依然很简单?如果忘记了文件对话框类构造函数的参数意义,可以回到鸡啄米来看看或者在MSDN上查阅。


以下程序中:

AfxMessageBox(_T("真的要退出程序吗"), 
MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2))

MB_OKCANCEL表示提示消息对话框有出现两个按钮,IDOK 和 IDCANCEL。当用户点击确定按钮也就是IDOK时,AfxMessageBox就会响应CDialog::OnOK();这个虚函数,调用EndDialog(IDOK);AfxMessageBox,同时得到返回值是IDOK

void CDemo1Dlg::OnCancel() 
{
 // TODO
 if(IDOK==AfxMessageBox(_T("真的要退出程序吗"),
  MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2))
 {
  CDialog::OnCancel();
 }
}


© 著作权归作者所有

共有 人打赏支持
Amamatthew
粉丝 67
博文 1050
码字总数 76443
作品 0
厦门
后端工程师
文件选择对话框:CFileDialog

程序如下: CString FilePathName; //文件名参数定义 CFileDialog Dlg(TRUE,NULL,NULL, OFNHIDEREADONLY | OFNOVERWRITEPROMPT, "TXT Files(.txt)|.txt|All Files(.)|."); //打开文件 if(Dlg......

野渡书生
2016/03/11
7
0
【转载】CFileDialog使用

CFileDialog经常用,但经常忘,现归纳整理下,方便今后查询。 例子: CFileDialog openDlg( TRUE, "Material File(.material)|.material", NULL, OFNHIDEREADONLY | OFNOVERWRITEPROMPT, "Ma......

weixin_42019823
04/21
0
0
MFC中的几个常用类——CFileDialog

1 简介 CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。 可以用构造函数提供的方式使用CFileDialog,也...

zhangyujsj
2014/12/08
0
0
C++_CFileDialog

CFileDialog类封装了Windows常用的文件对话框 CFileDialog构造函数的定义形式为: 第一个参数: bOpenFileDialog : TRUE则显示打开文件对话框,FALSE则显示保存文件对话框。 第二个参数: lp...

一个小妞
2017/04/06
0
0
File Operations

For example: When user click browse button, the function will refresh the value from controls to variables. As the same reason, the function will refresh the value from variable......

DongdongL
2016/03/01
70
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部