CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
1 要使用CFileDialog,先用CFileDialog构造函数构造一个对象,CFileDialog的构造函数如下:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
参数意义如下:
- bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存文件对话框。
- lpszDefExt 指定默认的文件扩展名。
- lpszFileName 指定默认的文件名。
- dwFlags 指明一些特定风格。
- lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
- pParentWnd 为父窗口指针。
2 当创建了一个对话框后,可以设置或修改m_ofn结构中的任何值,以初始化对话框控件的值或状态。m_ofn结构是OPENFILENAME类型的
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
3 初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。当DoModal返回IDOK,可以使用某一个CFileDIalog的公共成员函数获取用户输入的信息。
CFileDialog //构造一个CFileDialog对象操作
DoModal //显示对话框并使用户可以进行选择
GetPathName //返回选定文件的完整路径
GetFileName //返回选定文件的文件名
GetFileExt //返回选定文件的扩展文件名
GetFileTitle //返回选定文件的标题
GetNextPathName //返回下一个选定文件的完整路径
GetReadOnlyPref //返回选定文件的只读状态
GetStartPosition //返回文件名列表的第一个元素位置覆盖的函数
假如选择的文件是C:WINDOWSTEST.EXE
则:
(1)GetPathName();取文件名全称,包括完整路径。取回C:\WINDOWS\TEST.EXE
(2)GetFileName();取文件全名:TEST.EXE
(3)GetFileTitle();取回TEST
(4)GetFileExt();取扩展名EXE
补充: 在控制台下使用这个类需要设置在静态库中使用MFC,然后构造 AfxSetResourceHandle(GetModuleHandle(NULL));
4 析构一个CFileDialog对象是自动,无须调用CDialog::EndDialog。
5 要使用户选用多个文件,可在调用DoModal之前设置OFN_ALLOWMULTISELECT标志。你应提供文件名缓冲区来放置返回的多个文件名的列表,这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现,要在创建了CFileDialog之后调用DoModal之前进行此操作。另外,必须用m_ofn.lpstrFile指向的缓冲区字节数来设置m_ofn.nMaxFile。
实例代码如下,打开初始目录为C盘,选择其中的图片文件:
BOOL COpenFileDlgDlg::OnInitDialog() { .... TCHAR fileter[] = _T("图像(*.bmp;*.tif;*.jpg;*.JEPG) | *.bmp; *.tif; *.jpg;*.JEPG | All Files(*.*) | *.* ||"); //文件对话框 CFileDialog fdlg(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, fileter); //设置初始文件目录 fdlg.m_ofn.lpstrInitialDir = _T("c:\\"); //弹出对话框,如果点击OK if(fdlg.DoModal() == IDOK) { //获取打开文件的文件名 CString fileName = fdlg.GetPathName(); CString tip("当前打开的文件名为:"); tip += fileName; MessageBox(tip.GetString(),NULL, MB_OK); } .... }