CFileDialog类应用详解
原文地址:http://blog.csdn.net/bxwang1/article/details/3220609
构造函数原型:
CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);
参数:
bOpenFileDialg 如果为TRUE, 则创建文件打开对话框;如果为FALSE,则构造一个File Save As(另存为)对话框。
lpszDefExt 缺省文件扩展名,如果用户在文件名编辑框中不包含扩展名,则lpszDefExt定义的扩展名自动加到文件名后。如果为NULL,则不添加扩展名。
lpszFileName 初始显示于文件名编辑框中的文件名,如果为NULL,则不显示初始文件名。
dwFlags 一个或多个标志的组合,使你可定制对话框。要了解这些标志的描述,可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。如果你改变m_ofn.Flags结构成员,在改变中用OR操作保持缺省行为完整。
lpszFilter 一列字符串对,指定可以应用到文件的过滤器。如果指定过滤器,仅被选择的文件显示于文件列表框中。请参阅说明部分,了解如何使用过滤器。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 指向文件对话框对象的父窗口或拥有者窗口。
要使用CFileDialog,首先用构造函数构造一个对象,当创建了一个对话框后,可以设置或修改m_ofn结构中的值来初始化对话框控件的值或状态。初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。
重要函数:
CString CFileDialog::GetPathName( ) 得到完整的文件名(包括目录名和扩展名)如c:/test/test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名(包括扩展名).如test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如txt
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名,如test1
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件的位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。
打开大量文件:
使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。
lpstrFile缓冲区字节数限制:
1 在Windows 95/98/Me下只能在ANSI下使用,且没有大小限制;
2 在Windows NT 4.0及更早版本下,被限制在32k字节以内;
3 在Windows 2000/XP版本下,MSDN中介绍说在ANSI下32k字节,Unicode下没有限制。但是,实际上两者都被限制在32k字节以内;
示例:
以下是一个使用该类进行多文件名选择的例子。
#include "cderr.h"
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL);
CString fileName;
DWORD MAXFILE = 32*1024+13; //可以适当大一些,但是不要太大,多了也是浪费!
/*虽然限制在32k字节以内,但是在运行时少于此值将会返回IDCANCEL及FNERR_BUFFERTOOSMALL错误。运行时我选择了800个文件只能读取564个文件路径和文件名列表,共计32781个字节*/
dlg.m_ofn.lpstrFile = fileName.GetBuffer(MAXFILE);
dlg.m_ofn.nMaxFile = MAXFILE;
fileName.ReleaseBuffer();
int iReturn = dlg.DoModal();
if(iReturn == IDOK)
{
int nCount = 0;
POSITION pos = dlg.GetStartPosition();
while (pos != NULL)
{
dlg.GetNextPathName(pos);
nCount++;
}
CString str;
str.Format(_T("Successfully opened %d files "), nCount);
AfxMessageBox(str);
}
else if(iReturn == IDCANCEL)
AfxMessageBox(_T("Cancel"));
if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL)
AfxMessageBox(_T("BUFFERTOOSMALL"));
/
CFileDialog
CObject |
└CCmdTarget |
└CWnd |
└CDialog |
└CCommonDialog |
└CFileDialog |
CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
可以用构造函数提供的方式使用CFileDialog,也可以从CFileDialog派生出自己的对话类并编写一个构造函数来适应你的需要。每种情况下,对话框都与标准MFC对话框一样工作。因为它们都是CCommonDialog类的派生类。
要使用CFileDialog,先用CFileDialog构造函数构造一个对象,当创建了一个对话框后,可以设置或修改m_ofn结构中的任何值,以初始化对话框控件的值或状态。m_ofn结构是OPENFILENAME类型的。要了解更多信息,可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。
初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。DoModal返回不论是用户选择了OK(IDOK)还是取消(IDCANCEL)按钮。
当DoModal返回IDOK,可以使用某一个CFileDIalog的公共成员函数获取用户输入的信息。
CFileDIalog包含许多保护成员,使你可以处理常用的共享冲突、文件名合法性检查、列表框改变通知。这些保护成员对许多应用来说用处不大,因为缺省处理是自动的。对这些函数来说,消息映射入口是不必要的,因为它们是标准虚函数。
可以使用Windows CommDlgExtendError函数判断在初始化对话框时是否是发生了错误,并获取关于错误的更多信息。
析构一个CFileDialog对象是自动,无须调用CDialog::EndDialog。
要使用户选用多个文件,可在调用DoModal之前设置OFN_ALLOWMULTISELECT标志。你应提供文件名缓冲区来放置返回的多个文件名的列表,这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现,要在创建了CFileDialog之后调用DoModal之前进行此操作。另外,必须用m_ofn.lpstrFile指向的缓冲区字节数来设置m_ofn.nMaxFile。
CFileDialog依赖于Windows3.1及以后版本中的COMMDLG.DLL。
如果从CFileDialog中派生出一个新类,可用消息映射处理。要扩展消息处理,从CWnd中派生一个类,向新类中加入一个消息映射并为新消息提供成员函数,无须提供一个钩子函数来定制对话框。
要定制对话框,从CFileDialog中派生一个对象,提供一个定制对话模板,从扩展控件中加入一个消息映射,处理通知消息。任意未处理的消息将传递给基类。
无须定制钩子函数。
要了解有关使用CFileDialog的信息,可参阅联机文档“Visual C++程序员指南”中的“常用对话类”。
#include <afxdlgs.h>
CFileDialog类的成员
数据成员
m_ofn | Windows OPENFILENAME结构,提供对基本文件对话框参数的访问 |
构造函数
CFileDialog | 构造一个CFileDialog对象操作 |
DoModal | 显示对话框并使用户可以进行选择 |
GetPathName | 返回选定文件的完整路径 |
GetFileName | 返回选定文件的文件名 |
GetFileExt | 返回选定文件的扩展文件名 |
GetFileTitle | 返回选定文件的标题 |
GetNextPathName | 返回下一个选定文件的完整路径 |
GetReadOnlyPref | 返回选定文件的只读状态 |
GetStartPosition | 返回文件名列表的第一个元素位置 |
可覆盖的函数
OnShareViolation | 发生共享冲突时调用 |
OnFileNameOK | 确认键入对话框中的文件名 |
OnLBSelChangedNotify | 当列表框选择改变时调用 |
OnInitDone | 处理WM_NOTIFY CDN_INITDONE消息 |
OnFileNameChange | 处理WM_NOTIFY CDN_SELCHANGE消息 |
OnFolderChange | 处理WM_NOTIFY CDN_FOLDERCHANGE消息 |
OnTypeChange | 处理WM_NOTIFY CDN_TYPECHANGE消息 |
CFileDialog类应用详解相关推荐
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- .net System.Web.Caching.Cache缓存类使用详解(转载)
转自:http://www.cnblogs.com/virusswb/articles/1681561.html net System.Web.Caching.Cache缓存类使用详解 System. ...
- ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解
一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...
- Java记录 -22- Java的基类Object详解
Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. Oracle官方在线 Java API Specifications http://www.oracle.co ...
- C#中NameValueCollection类用法详解
C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...
- pythonsvc_sklearn-SVC实现与类参数详解
sklearn-SVC实现与类参数 它是基于libsvm实现的.随着样本数量的增加,拟合时间的复杂度要高于二次,这就使得当样板数量超过一万个时,很难扩展到数据集中. 在多类处理时,是按照1对1的方案进 ...
- laravel 如何 new php 类,PHP实例:laravel通过创建自定义artisan make命令来新建类文件详解...
<PHP实例:laravel通过创建自定义artisan make命令来新建类文件详解>要点: 本文介绍了PHP实例:laravel通过创建自定义artisan make命令来新建类文件详 ...
- (117)System Verilog类继承详解
(117)System Verilog类继承详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类继承详解 5)结语 1.2 FPGA ...
- (116)System Verilog类合成(类包含关系)详解
(116)System Verilog类合成(类包含关系)详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类合成(类包含关系)详解 ...
最新文章
- 海南省长沈晓明:海南自贸区先导性项目取得阶段性进展
- 做接口测试最重要的知识点
- Knative 化繁为简之道:应用部署与访问
- LINQPad工具-linq、sql、IL优化和转换
- 怎么添加流程图画布_工作流程图软件,教你绘制简单的工作流程图!
- 多个div在一个div中一行水平显示
- iOS开发类似于刮刮卡效果,手指划过的区域形成画笔。适用于取出部分图片(截图),如截取出图片中带文字的区域部分。...
- 技术,要拿得起,更要放得下
- 计算机上安装的游戏怎么删除,win7自带游戏安装包太占内存怎么删除?
- imdisk虚拟光驱安装linux,imdisk虚拟磁盘驱动器如何加载iso文件?大白菜ImDisk加载iso文件教程...
- 简易特效制作ByUnityParticleSystem
- linux权限管理的设计,Linux权限管理漫谈之用户切换
- HHKB静电容键盘真是程序员键盘吗?
- vuejs 项目生成二维码工具 vue-qr
- H5架设新手小白搭建教程(适用于新手)
- win10系统无法访问ftp服务器地址,win10系统访问不了ftp的解决教程
- initWithFrame/initWithCode/awakeFromNib调用
- mysql查询汉字拼音首字母_MySQL查询汉字的拼音首字母实例教程
- FG-301A型综合大气采样器介绍
- Linux学习笔记(十一):磁盘配额、磁盘阵列与逻辑卷
热门文章
- 【ConfluxNews】2023.3.13 浙江卫视联合有哇宇宙发行基于树图Conflux区块链的《我们的客栈》数字文创
- Nessus在线更新教程
- 淡马锡:48年新加坡「最强国企」,深入布局Web3
- 阿里技术团队编写的对标金九银十大厂面试指南又在 git 上火了
- 超级简单的Swift5入门实例
- Linux下为网卡分配IP的工具dhclient
- Matlab根据用户选择更新绘图的自动调整布局式 App
- Android studio观察日志简单实例
- python中io.textio_关于python的IO读写的二三事
- 注册时按钮上的时间倒计时