一、示例代码在Microsoft Visual Studio 2013中编译通过,运行正常。
//CFileDialog类
BOOL isOpen = TRUE; //是否打开(TRUE为打开对话框,FALSE为保存对话框)}
二、MSDN上查到的构造函数
explicit CFileDialog(
BOOL bOpenFileDialog, //显示的窗口,文件打开对话框或文件另存为对话框示例代码中:
给第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原文:
FlagsType: 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);
}