一、CFileDialog基本用法
CFileDialog构造函数原型如下:
CFileDialog Dlg( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
(1)各个参数的意义说明如下
bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。
“Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||”
说明:文件的类型说明和扩展名间用'|'分隔,同种类型的文件扩展名间用';'分隔,每种文件类型间用'|'分隔,末尾用'||'指明。
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CStringCFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c: est est1.txt
CStringCFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CStringCFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CStringCFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
POSITIONCFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CStringCFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。
二、选择多个文件
使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。
如果是在Windows NT4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断。以下是一个使用该类进行多文件名选择的例子:
#include "cderr.h" //for definition of FNERR_BUFFERTOOSMALL CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL); DWORD MAXFILE = 4000 dlg.m_ofn.nMaxFile = MAXFILE; char* pc = new char[MAXFILE]; dlg.m_ofn.lpstrFile = pc; dlg.m_ofn.lpstrFile[0] = NULL; 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("Successfully opened %d files ", nCount); AfxMessageBox(str); } else if(iReturn == IDCANCEL) AfxMessageBox("Cancel"); if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL) AfxMessageBox("BUFFERTOOSMALL"); delete []pc;