VS2010/MFC编程入门之十七(对话框:文件对话框)
上一讲鸡啄米介绍的是消息对话框,本节讲解文件对话框。文件对话框也是很常用的一类对话框。
文件对话框的分类
文件对话框分为打开文件对话框和保存文件对话框,相信大家在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():获得选定文件的标题,即不包括后缀名。
GetFolderPath():获得选定文件的目录。
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.运行此程序,在结果对话框上点“打开”按钮,显示打开文件对话框如下:
点“保存”按钮后,显示保存文件对话框:
在打开文件对话框和保存文件对话框都选择了文件路径后,主对话框如下:
到此,文件对话框就讲完了,是不是依然很简单?如果忘记了文件对话框类构造函数的参数意义,可以回到鸡啄米来看看或者在MSDN上查阅。
转自:http://www.jizhuomi.com/software/181.html
VS2010/MFC编程入门之十七(对话框:文件对话框)的更多相关文章
- VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)
上一节中鸡啄米讲了MFC异常处理,本节的主要内容是字体CFont类. 字体简介 GDI(Graphics Device Interface),图形设备接口,是Windows提供的一些函数和结构,用于在 ...
- VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)
鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使用. 工具栏的使用 上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有 ...
- VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...
- VS2010/MFC编程入门之十九(对话框:颜色对话框)
鸡啄米在上一节中为大家讲解了字体对话框的使用方法,熟悉了字体对话框,本节继续讲另一种通用对话框--颜色对话框. 颜色对话框大家肯定也不陌生,我们可以打开它选择需要的颜色,简单说,它的作用就是用来选择颜 ...
- VS2010/MFC编程入门之十六(对话框:消息对话框)
前面几节鸡啄米讲了属性页对话框,我们可以根据所讲内容方便的建立自己的属性页对话框.本节讲解Windows系统中最常用最简单的一类对话框--消息对话框. 我们在使用Windows系统的过程中经常会见到消 ...
- VS2010/MFC编程入门之十八(对话框:字体对话框)
鸡啄米在上一节为大家讲解了文件对话框的使用,本节则主要介绍字体对话框如何应用. 字体对话框的作用是用来选择字体.我们也经常能够见到.MFC使用CFontDialog类封装了字体对话框的所有操作.字体对 ...
- VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)
原文地址:http://www.jizhuomi.com/software/166.html 上一讲鸡啄米讲了属性页对话框和相关的两个类CPropertyPage类和CPropertySheet类,对 ...
- 工作总结:VS2010/MFC编程入门之十六(对话框:消息对话框)
原文地址:http://www.jizhuomi.com/software/171.html 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中 ...
- VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)
属性页对话框包括向导对话框和一般属性页对话框两类,上一节鸡啄米讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的 ...
随机推荐
- Redis(二)-- 发布订阅、事务、安全、持久化
一.Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 打开两个窗口:session1 和 session2 在sess ...
- 查看用户信息:w
w命令有两个用途: (1) 用于查看当前系统负载(2) 用于查看当前登录用户的行为和信息,执行这个命令可以得知当前登入系统的用户有哪些人,以及他们正在执行哪些程序 [root@localhost ~] ...
- SDRAM容量的计算方法
当我在看有关SDRAM的芯片手册的时候,我一直在想这样一个问题:SDRAM的容量它究竟是如何计算的呢?经过查找网上的各种资料,最后在这里给大伙分享一下我的总结! 就以我的开发板的SDRAM的芯片手册的 ...
- VC6IDE环境宏辅助添加移除注释
VC6很老了(15年),当年的IDE功能不如现在的各种IDE功能丰富. 比如自动添加注释,就需要借助第三方插件或自己动手实现. 最近做些code试验,新装上了VC6,但是改代码时不能自动添加注释,很不 ...
- java基础---->多线程之Runnable(一)
java线程的创建有两种方式,这里我们通过简单的实例来学习一下.一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活. java中多线程的创建 一.通过继承Thread类来创建多线程 pu ...
- Dell、IBM服务器配置远程管理卡
author: headsen chen date: 2018-10-09 14:12:32 1,IBM的服务器: 需要在bios里边进行配置,具体配置如下: , 开机画面过完之后,按F1进入bio ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- spring+springMVC+Mybatis 中使用@Transcational方式管理事务的配置方法
springMVC 中,事务通常都在service层控制,当然controller层也可以用事务,只要配置配对,但通常不建议直接在controller层配事务,controller的作用是管理参数以及 ...
- 从零打造在线网盘系统之Hibernate配置O/R映射
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...
- 03.JMS深入
1.JMS API JMS API可以分为3个主要部分:公共API.点对点API和发布/订阅API.在JMS1.1中,公共API可被用于向一个队列或主题发送消息,或从其中接收消息.点对点API ...