CFileDialog选择多个文件

一、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 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。


(2)参数格式的例子

“Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||”

说明:文件的类型说明和扩展名间用'|'分隔,同种类型的文件扩展名间用';'分隔,每种文件类型间用'|'分隔,末尾用'||'指明。


(3)常用函数

创建文件对话框可以使用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; 

你可能感兴趣的:(C/C++/VC)