【vc6++学习笔记】cFileDialog用法

"cFileDialog" 通常是指一个文件对话框,用于在计算机程序中打开或保存文件时与用户进行交互。这是一个常见的图形用户界面(GUI)元素,允许用户浏览文件系统、选择文件路径和输入文件名。

在不同的编程环境和框架中,文件对话框的实现方式可能会有所不同。例如,在Windows平台上,使用C++编程时,你可以使用 Windows API 中的 "GetOpenFileName" 函数来创建一个打开文件对话框,或使用 "GetSaveFileName" 函数创建一个保存文件对话框。这些函数允许你自定义对话框的外观和行为。

在其他编程环境中,例如使用Qt、wxWidgets、Tkinter等框架,也提供了类似的文件对话框组件,可以方便地与用户交互选择文件路径和名称。

总之,"cFileDialog" 是一个通用的概念,用于表示各种编程环境中的文件对话框功能,用于与用户交互地选择文件或保存文件。具体实现方式取决于所使用的编程语言和框架。

`CFileDialog` 是在使用 MFC(Microsoft Foundation Classes)框架进行 Windows 编程时用于文件对话框的类。它允许你创建打开文件对话框或保存文件对话框,与用户交互选择文件路径和名称。以下是一个简单的示例用法:```cpp

#include <afxdlgs.h>  // 包含 MFC 文件对话框头文件

void OpenFileWithCFileDialog()
{
    CFileDialog fileDlg(TRUE);  // 创建打开文件对话框
    if (fileDlg.DoModal() == IDOK)  // 显示对话框并等待用户交互
    {
        CString filePath = fileDlg.GetPathName();  // 获取用户选择的文件路径
        // 在这里可以使用 filePath 进行后续操作
    }
}

在上面的示例中,我们使用 `CFileDialog` 类创建一个打开文件对话框。通过 `DoModal()` 方法显示对话框,并等待用户交互。如果用户点击对话框中的 "打开" 按钮,那么我们通过 `GetPathName()` 方法获取用户选择的文件路径。

类似地,你也可以使用 `CFileDialog` 来创建保存文件对话框。只需要将构造函数中的参数改为 `FALSE`,并在用户交互后使用 `GetPathName()` 获取用户指定的保存路径。

请注意,上述示例基于 MFC 框架,只适用于 Windows 平台。如果你使用的是其他框架或跨平台工具包,文件对话框的用法会有所不同。

 

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);

参数说明:

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成员函数显示对话框并使用户输入路径和文件。

重要函数 & 多文件实例

  • 重要函数
    //得到完整的文件名(包括目录名和扩展名)如c:/test/test1.txt 
    CString CFileDialog::GetPathName();  
    
    //得到完整的文件名(包括扩展名).如test1.txt
    CString CFileDialog::GetFileName();
    
    //得到完整的文件扩展名,如txt 
    CString CFileDialog::GetExtName();
    
    //得到完整的文件名,不包括目录名和扩展名,如test1 
    CString CFileDialog::GetFileTitle();
    
    //对于选择了多个文件的情况得到第一个文件的位置
    POSITION CFileDialog::GetStartPosition();
    
    //对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名
    CString CFileDialog::GetNextPathName(POSITION& pos)
    //ps:必须已经调用过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"  //包含此头文件,声明FNERR_BUFFERTOOSMALL此宏

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继承关系如上,自顶向下。

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>

数据成员:

m_ofn    Windows OPENFILENAME结构,提供对基本文件对话框参数的访问
构造函数:

Function    Descripation
CFileDialog    构造一个CFileDialog对象操作
DoModal    显示对话框并使用户可以进行选择
GetPathName    返回选定文件的完整路径
GetFileName    返回选定文件的文件名
GetFileExt    返回选定文件的扩展文件名
GetFileTitle    返回选定文件的标题
GetNextPathName    返回下一个选定文件的完整路径
GetReadOnlyPref    返回选定文件的只读状态
GetStartPosition    返回文件名列表的第一个元素位置
可覆盖函数:

Function    Descripation
OnShareViolation    发生共享冲突时调用
OnFileNameOK    确认键入对话框中的文件名
OnLBSelChangedNotify    当列表框选择改变时调用
OnInitDone    处理WM_NOTIFY CDN_INITDONE消息
OnFileNameChange    处理WM_NOTIFY CDN_SELCHANGE消息
OnFolderChange    处理WM_NOTIFY CDN_FOLDERCHANGE消息
OnTypeChange    处理WM_NOTIFY CDN_TYPECHANGE消息

上面可覆盖函数,我也没用过,virtual型函数,想必使用方法相差不大,重写调用当前即可。

示例:
1. 参数指定构造文件打开对话框,其余默认参数

CFileDialog dlg(TRUE);                    // 构造文件打开对话框  
dlg.m_ofn.lpstrTitle = _T("Open Image");  // 文件打开对话框标题  
if(IDOK != dlg.DoModal())                 // 判断是否成功选中文件  
{
    return;  
}
CString path = dlg.GetPathName();         // 获取文件路径 

2. 指定构造文件打开对话框

CFileDialog dlg(TRUE, NULL, NULL,   
    OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,  
    _T("image files(*.jpg)|*.jpg|Worksheet Files|*.xls|All Files(*.*)|*.*||"),  
    NULL);                            // 构造文件打开对话框  
dlg.m_ofn.lpstrTitle = _T("Open Image");  // 文件打开对话框标题  
if(IDOK != dlg.DoModal())                 // 判断是否成功选中文件  
{
    return; 
}
CString path = dlg.GetPathName();         // 获取文件路径  

3. 指定构造文件另存为对话框

CString strFilePath;
CFileDialog fileDlg(false, _T("txt"),_T("文件名")
                    , OFN_OVERWRITEPROMPT| OFN_PATHMUSTEXIST
                    , _T("文件(*.txt)|*.txt|所有文件(*.*) |*.*||"));
if (fileDlg.DoModal() == IDOK)
{
    strFilePath = fileDlg.GetPathName();
    //TODO:下面添加其余代码
}

总结
CFileDialog类的相关应用,大概就了解至此,本人也是在用了BROWSEINFO结构之后,听朋友谈起,还有这么一个类,然后才简单了解了一下。

 

 

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IIIIIII_II

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值