MFC提供打开文件对话框可以选择文件名,如果想选择目录的话,就不能使用CFileDialog,实现过程如下:
CStringsFolderPath;
BROWSEINFO bi;
TCHAR Buffer[MAX_PATH];
//初始化入口参数bi开始
bi.hwndOwner = NULL;
bi.pidlRoot =NULL;//初始化制定的root目录很不容易,
bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
bi.lpszTitle = tittle;
//bi.ulFlags = BIF_BROWSEINCLUDEFILES;//包括文件
bi.ulFlags = BIF_EDITBOX;//包括文件
bi.lpfn = NULL;
bi.iImage=IDR_MAINFRAME;
//初始化入口参数bi结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if(pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
//取得文件夹路径到Buffer里
sFolderPath = Buffer;//将路径保存在一个CString对象里
}
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 指明一些特定风格。
OFN_HIDEREADONLY:隐藏只读选项
OFN_OVERWRITEPROMPT:覆盖已有文件前提
OFN_ALLOWMULTISELECT:允许选择多个文件
OFN_CREATEPROMPT:如果输入的文件名不存在,则对话框返回询问用户是否根据次文件名创建文件的消息框
OFN_FILEMUSTEXIST:只能输入已存在的文件名
OFN_FORCESHOWHIDDEN:可以显示隐藏的文件
OFN_NOREADONLYRETURN:不返回只读文件
OFN_OVERWRITEPROMPT:保存的文件已存在时,显示文件已存在的信息
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"ChartFiles (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针。
对话框选项常用属性(实例:dialog)
dialog.m_ofn.lpstrTitle:显示窗口标题。
dialog.m_ofn.lpstrInitialDir:初始化展开路径。
dlg.m_ofn.lpstrFile:默认文件
dlg.m_ofn.lpstrFilter:文件筛选类型,注意与lpszFilter区别,要用"\0",不能用"|"
如:dlg.m_ofn.lpstrFilter="所有文件\0*.*\0图像文件\0*.jpg;*.bmp;*.gif\0\0";
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CStringCFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:testtest1.txt
CStringCFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CStringCFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CStringCFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
POSITIONCFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CString CFileDialog::GetNextPathName(POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。
例:
CFileDialogGetFile(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,"Microsoft Excel(*.xls)|*.xls|AllFiles(*.*)|*.*");
CFileDialogGetFile(打开文件对话框(TRUE),扩展名(NULL),文件名(NULL),风格-文件必须存在(OFN_FILEMUSTEXIST),查看文件类型-EXCEL文件,所有文件(Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*);
选择多个文件示例:
CFileDialogopenDlg( TRUE, /*bOpenFileDialog=TRUE时打开文件,为FALSE时保存文件*/
NULL,
NULL,
OFN_ALLOWMULTISELECT, /*dwFlags为OFN_ALLOWMULTISELECT表示可以选择多个文件*/);
//构建CFielDialog对象时指定了OFN_ALLOWMULTISELECT的情况下,需要在对象DoModal()函数返回之前需要指定足够大
//的内存空间来存放文件名.如果选择的多个文件名组成的字符串长度大于指定的内存空间是就会导致DoModal()返回IDCANCEL.
/*申请内存来存放多个文件名组成的字符串*/
const intnMaxFiles = 1000;
const intnMaxPathBuffer = (nMaxFiles * (MAX_PATH + 1)) + 1;
LPWSTR pc =(LPWSTR)malloc(nMaxPathBuffer * sizeof(WCHAR));
if( pc )
{
openDlg.GetOFN().lpstrFile = pc;
openDlg.GetOFN().lpstrFile[0] = NULL;
openDlg.nMaxFile = nMaxPathBuffer;
if( openDlg.DoModal() == IDOK )
{
POSITION posStart =openDlg.GetStartPosition();
while( posStart )
{
//从pc所指向的内存中解析出每个文件的名字,这里的fileName所占的内存不能和pc所占的内存发生冲突
CString fileName =openDlg.GetNextPathName();
// pathName= fileDlg.GetNextPathName(pos_file);
}
}
free(pc);
}