例子
CFileDialog openDlg( TRUE,
"Material File(*.material)|*.material",
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Material File(*.material)|*.material||",
this);
原型
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) |
lpszFilter | 为父窗口指针。 |
pParentWnd | 为父窗口指针。 |
扩展名
扩展名应遵循下面的格式:
"Chart Files (*.xlc)|*.xlc| Worksheet Files (*.xls)|*.xls| Data Files (*.xlc;*.xls)|*.xlc ; *.xls| All Files (*.*)|*.*||";
文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
另外过滤器也可以这样设置:dl.m_ofn.lpstrFilter = _T("xls文件\0*.xls\0csv文件\0*.csv\0xlsx文件\0*.xlsx\0\0");
注意有时候用 | 字符分隔时会出现错误,这时候可以使用 \0 字符
接口
CString GetPathName( ) | 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt |
CString GetFileName( ) | 得到完整的文件名,包括扩展名如:test1.txt |
CString GetExtName( ) | 得到完整的文件扩展名,如:txt |
CString GetFileTitle ( ) | 得到完整的文件名,不包括目录名和扩展名如:test1 |
POSITION GetStartPosition( ) | 对于选择了多个文件的情况得到第一个文件位置。 |
CString GetNextPathName( POSITION& pos ) | 对于选择了多个文件的情况得到下一个文件位置,同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。 |
mfc实践
效果
关键代码
void CMfcDlg::OnButton1()
{
TCHAR szFolderPath[MAX_PATH] = {0};
CString strFolderPath = TEXT("");
// TODO: Add your control notification handler code here
BROWSEINFO sInfo;
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot = 0;
sInfo.lpszTitle = _T("请选择一个文件夹:");
//sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
sInfo.lpfn = NULL;
// 显示文件夹选择对话框
LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
if (lpidlBrowse != NULL)
{
// 取得文件夹名
if (::SHGetPathFromIDList(lpidlBrowse,szFolderPath))
{
strFolderPath = szFolderPath;
}
}
if(lpidlBrowse != NULL)
{
::CoTaskMemFree(lpidlBrowse);
}
}
void CMfcDlg::OnButton2()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
// 设置过滤器
TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
// 构造打开文件对话框
CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
CString strFilePath;
// 显示打开文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里
strFilePath = fileDlg.GetPathName();
SetDlgItemText(IDC_EDIT1, strFilePath);
}
}
void CMfcDlg::OnButton3()
{
// TODO: Add your control notification handler code here
static char BASED_CODE szFilter[] = "Worksheet Files (*.xls)|*.xls||";
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL);
dlg.DoModal();
CString str=dlg.GetPathName();
CString filename=dlg.GetFileName();
SetDlgItemText(IDC_EDIT1, str);
}
void CMfcDlg::OnButton4()
{
// TODO: Add your control notification handler code here
//TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
static char BASED_CODE szFilter[] = "Worksheet Files (*.xls)|*.xls||";
// 构造打开文件对话框
CFileDialog fileDlg(TRUE, _T("xls"), NULL, 0, szFilter, this);
CString strFilePath;
// 显示打开文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里
strFilePath = fileDlg.GetPathName();
SetDlgItemText(IDC_EDIT1, strFilePath);
}
}