文档章节

CFileDialog:文件对话框

Amamatthew
 Amamatthew
发布于 2014/06/14 15:54
字数 1862
阅读 36
收藏 0
点赞 0
评论 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
粉丝 68
博文 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
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
VC++ 打开文件夹,保存文件等对话框的调用

VC++ 打开文件夹,保存文件等对话框的调用 一。打开文件夹: 1。CFileDialog实现 CFileDialog hFileDlg(true,NULL , NULL, OFNFILEMUSTEXIST | OFNREADONLY | OFNPATHMUSTEXIST, TEXT("驱动文...

barsoom
2012/11/26
0
0
1.0.1-学习Opencv与MFC混合编程之---播放AVI视频

资源源代码:http://download.csdn.net/detail/nuptboyzhb/3961639 版本1.0.1新增内容 Ø 新建菜单项,Learning OpenCV——> OpenCVr入门——>播放AVI视频。 Ø 为’ 播放AVI视频’菜单项设置...

长平狐
2012/10/08
1K
0
VC++2003/2005/2008 调用Mediaplayer的指南,

通过对CWMPPlayer4、CWMPSettings和CWMPControls等几个类的使用可以实现Windows Media Player的大部分常规功能,如果需要做进一步的控制,可以在用下面这些函数返回相关类对象后调用相关成员...

junwong
2012/03/09
0
0
1.0.2-学习Opencv与MFC混合编程之---为播放AVI视频添加滑动条

源代码地址:http://download.csdn.net/detail/nuptboyzhb/3961642 版本1.0.2新增内容 Ø 全局变量和函数的添加: 在CVMFCview.cpp文件中增加全局变量和全局函数 //-----------------全局变量...

长平狐
2012/10/08
447
0
visual c+ 2010开发的播放器

VC2010可谓是微软的王牌产品,它以强大的功能而赢得了广大程序员的爱好。而用VC的AppWizard、ClassWizard和其中的各种控件可以方便地建立应用程序。 本文就介绍用VC6.0自带的一个ActiveX控件...

crossmix
2015/04/15
0
0
【精心整理】【实用】visual C++中最常用的类与API函数

这篇文章能让初学者快速了解visual C++ MFC中常见的核心的类与函数,虽然全部看下来有点枯燥,但对初学者快速了解MFC的框架结构很有好处。 常用类 CArchive类:用于二进制保存档案 CBitmap类...

长平狐
2012/11/12
814
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaEE——JavaScript

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 JavaScript 内置对象 String对象方法: date对象...

凯哥学堂
6分钟前
0
0
Git 远程代码回滚master

方式一(推荐): git revert commit-id 方式二(不推荐):不推荐原因:推送到线上后,其它开发人员需要重新clone git reset --hard commit-id git push origin HEAD --force...

浮躁的码农
6分钟前
0
0
Elasticesearch学习(7)—— ES查询与Java API的对应关系

1、普通查询 类型 ES查询语句 Java查询实现 结果 查询格式 { "query": { "bool": { "must": [], "must_not": [], "should": [], "filter": [] } }, "from": 0, "size": 10, "sort": [] } Que......

叶枫啦啦
7分钟前
4
0
getElementsByClassName()与getElementById()区别

1.document.getElementsByClassName() 返回的是数组 使用:document.getElementsByClassName("className")[0].innerText='具体内容' 2.document.getElementById() 返回的是单个元素 使用:d......

botkenni
18分钟前
0
0
MyBatis入门

一、安装 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency> 二、从 XML 中构建 SqlSessionFactory String r......

一个yuanbeth
19分钟前
0
0
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
21分钟前
0
0
【转】使用Lombok来优雅的编码

前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。 正文 添加依赖 在 pom.xml 文件中添加相关依赖:...

HAVENT
23分钟前
0
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
31分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
40分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部