CFileDialog类应用详解

转自:http://blog.csdn.net/bxwang1/article/details/3220609

最近编程用到CFileDialog类选择多个文件,在网上搜索了一下,讲的千差万别,自己总结了一下,

与大家一起分享!

构造函数原型
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消息

   

  

你可能感兴趣的:(windows,null,文档,mfc,扩展,byte)