CFileDialog类示例

一、示例代码在Microsoft Visual Studio 2013中编译通过,运行正常。

//CFileDialog类

BOOL isOpen = TRUE;        //是否打开(TRUE为打开对话框,FALSE为保存对话框)    
CString defaultDir = _T("C:\\Users\\TF\\Documents");   //默认打开的文件路径    
CString defaultFile = L"test1.txt";         //默认打开的文件名    
CString filter = L"文本(*.txt)|*.txt|所有类型(*.*)|*.*||";   //文件过虑的类型    
CFileDialog openFileDlg(isOpen, NULL, defaultDir + "\\" + defaultFile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, NULL);
INT_PTR result = openFileDlg.DoModal();//是否选中文件,或取消了选择
if (result == IDOK)
{
CString pathName, fileName,titleName,extName;
pathName = openFileDlg.GetPathName();//得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
fileName = openFileDlg.GetFileName();//得到完整的文件名,包括扩展名如:test1.txt
titleName=openFileDlg.GetFileTitle();//得到完整的文件名,不包括目录名和扩展名如:test1
extName = openFileDlg.GetFileExt();// 得到完整的文件扩展名,如:txt
MessageBox(pathName + "\r" + fileName + "\r" + titleName + "\r" + extName);//通过显示,注意几者区别

}

二、MSDN上查到的构造函数

explicit CFileDialog(

    BOOL bOpenFileDialog,    //显示的窗口,文件打开对话框或文件另存为对话框
    LPCTSTR lpszDefExt = NULL,    //默认的文件扩展名,会自动追加到文件名后。
    LPCTSTR lpszFileName = NULL,    //显示在文件名编辑栏的初始文件名。  
    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,    //用来自定义对话框的标志组合(后详)  
    LPCTSTR lpszFilter = NULL,    //文件筛选(结构见后述)  
    CWnd* pParentWnd = NULL,    //父窗口指针(通常都NULL) 
    DWORD dwSize = 0,    //The size of the OPENFILENAME structure.(找时间查查OPENFILENAME structure)  
    BOOL bVistaStyle = TRUE);    //显示Vista样式,为TRUE时使用new Vista file dialogs,为FALSE时将使用旧样式dialogs.


示例代码中:

给第1、3、5个参数进行了赋值。而第2、4、6个参数使用了构造函数中的缺省值。没有用到后两个参数(第7、8个)。

三、关于lpszFiler参数

用来筛选在文件列表中显示的文件的类型。

1、参数由“文件类型说明”和“扩展名”组成,之间用“|”来分隔。例如示例中的

    “文本(*.txt)|*.txt”。其中“文本(*.txt)”是文件类型说明,*.txt是扩展名,中间用|分隔。

2、同种类型文件的扩展名间用“;"列出。例如,”数据文件()|*.dat;*.log;*.txt"。

3、各种文件类型间也用“|”来分隔。例如示例中的"文本(*.txt)|*.txt|所有类型(*.*)|*.*||”里的第二个“|”。

4、参数结束由两个“||”来表示。

多说一句,好吧,这个lpszFilter参数里面,有三种含义的“|”符号,感觉设计者够懒的,体会一下就懂了。

四、关于dwFlags参数

1、来自于“OPENFILENAME”结构中的成员“DWORD Flags;”(可在MSDN中查询OPENFILENAME structure)

2、MSDN原文:

Flags

Type: DWORD

A set of bit flags you can use to initialize the dialog box. When the dialog box returns, it sets these flags to indicate the user's input. This member can be a combination of the following flags.

3、MSDN上还有各个flags的Value和Meaning的表格。简化版如下:

#define OFN_READONLY                        0x00000001
#define OFN_OVERWRITEPROMPT          0x00000002
#define OFN_HIDEREADONLY                0x00000004
#define OFN_NOCHANGEDIR                 0x00000008
#define OFN_SHOWHELP                      0x00000010
#define OFN_ENABLEHOOK                   0x00000020
#define OFN_ENABLETEMPLATE           0x00000040
#define OFN_ENABLETEMPLATEHANDLE     0x00000080
#define OFN_NOVALIDATE                     0x00000100
#define OFN_ALLOWMULTISELECT         0x00000200
#define OFN_EXTENSIONDIFFERENT       0x00000400
#define OFN_PATHMUSTEXIST              0x00000800
#define OFN_FILEMUSTEXIST                0x00001000
#define OFN_CREATEPROMPT               0x00002000
#define OFN_SHAREAWARE                  0x00004000
#define OFN_NOREADONLYRETURN        0x00008000
#define OFN_NOTESTFILECREATE                   0x00010000
#define OFN_NONETWORKBUTTON        0x00020000
#define OFN_NOLONGNAMES                        0x00040000    

五、关于多文件选择。(未深入,用到记得要注意)

六、关于路径。有文章指出,使用CFileDialog后,会把程序的当前路径设置成选中文件的路径。

1、https://blog.csdn.net/foreverhuylee/article/details/22082311《关于GetCurrentDirectory函数的用法》文中第10行。

2、https://www.cnblogs.com/kex1n/p/3595800.html《CFileDialog使用总结》文中倒数第3行。

好吧,编写代码测试一下。

在代码合适位置添加:

//显示未调用CFileDialog时的当前目录

TCHAR Buffer[MAX_PATH];//用于保存目录的字符数组
        CString currentDir
GetCurrentDirectory(MAX_PATH, Buffer);
currentDir=Buffer;
MessageBox(currentDir);

//显示调用CFileDialog后的当前目录
GetCurrentDirectory(MAX_PATH, Buffer);
currentDir = Buffer;
MessageBox(currentDir);

结果与网上的这些文章指出的情况不同!两次的显示的当前目录是一致的,没有因为调用CFileDialog发生改变。


最终代码:

//CFileDialog类
//显示未调用CFileDialog时的当前目录
TCHAR Buffer[MAX_PATH];//用于保存目录的字符数组
CString currentDir;
GetCurrentDirectory(MAX_PATH, Buffer);
currentDir=Buffer;
MessageBox(currentDir);
BOOL isOpen = TRUE;        //是否打开(TRUE为打开对话框,FALSE为保存对话框)    
CString defaultDir = _T("C:\\Users\\TF\\Documents");   //默认打开的文件路径    
CString defaultFile = L"test1.txt";         //默认打开的文件名    
CString filter = L"文本(*.txt)|*.txt|所有类型(*.*)|*.*||";   //文件过虑的类型    
CFileDialog openFileDlg(isOpen, NULL, defaultDir + "\\" + defaultFile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, NULL);
INT_PTR result = openFileDlg.DoModal();//是否选中文件,或取消了选择
if (result == IDOK)
{
CString pathName, fileName,titleName,extName;
pathName = openFileDlg.GetPathName();//得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
fileName = openFileDlg.GetFileName();//得到完整的文件名,包括扩展名如:test1.txt
titleName=openFileDlg.GetFileTitle();//得到完整的文件名,不包括目录名和扩展名如:test1
extName = openFileDlg.GetFileExt();// 得到完整的文件扩展名,如:txt
MessageBox(pathName + "\r" + fileName + "\r" + titleName + "\r" + extName);//通过显示,注意几者区别
//显示调用CFileDialog时的当前目录
GetCurrentDirectory(MAX_PATH, Buffer);
currentDir = Buffer;
MessageBox(currentDir);
}


你可能感兴趣的:(CFileDialog类示例)