1. CFileDialog使用总结
例子:
CFileDialog openDlg( TRUE, "Material File(*.material)|*.material", NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Material File(*.material)|*.material||", this);
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)
lpszFilter 指明可供选择的文件类型和相应的扩展名。
pParentWnd 为父窗口指针。
其中,扩展名应遵循下面的格式:
"Chart Files (*.xlc)|*.xlc| Worksheet Files (*.xls)|*.xls| Data Files (*.xlc;*.xls)|*.xlc ; *.xls| All Files (*.*)|*.*||";
文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。
dwFlags的风格有:
#define OFN_READONLY 0x00000001
#define OFN_OVERWRITEPROMPT 0x00000002
#define OFN_HIDEREADONLY 0x00000004
#define OFN_NOCHANGEDIR 0x00000008
#define OFN_SHOWHELP 0x00000010
#define OFN_ENABLEHOOK 0x00000020
#define OFN_ENABLETEMPLATE 0x00000040
#define OFN_ENABLETEMPLATEHANDLE 0x00000080
#define OFN_NOVALIDATE 0x00000100
#define OFN_ALLOWMULTISELECT 0x00000200
#define OFN_EXTENSIONDIFFERENT 0x00000400
#define OFN_PATHMUSTEXIST 0x00000800
#define OFN_FILEMUSTEXIST 0x00001000
#define OFN_CREATEPROMPT 0x00002000
#define OFN_SHAREAWARE 0x00004000
#define OFN_NOREADONLYRETURN 0x00008000
#define OFN_NOTESTFILECREATE 0x00010000
#define OFN_NONETWORKBUTTON 0x00020000
#define OFN_NOLONGNAMES 0x00040000
需要注意的是,用了CFileDialog之后,会把程序的当前路径设置成选中文件的路径
所以,如果程序里有用到IO访问或者数据库访问之类的本地操作时,需要注意你的当前路径
用相对路径的话就不是原来你的程序路径了,切记!
----------------------------------------------------------------------------------------------------------
打开文件对话框
const char pszFilter[] = _T("EXE File (*.txt)|*.txt|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
pszFilter, this);
dlg.m_ofn.lpstrInitialDir = "c://WINDOWS//" //设置对话框默认呈现的路径
if(dlg.DoModal() == IDOK)
{
CString strFilePath = dlg.GetPathName();
/*如果有多个文件,则
for(POSITION pos = dlg.GetStartPosition(); pos!=NULL; )
{ CString strFilePathName = dlg.GetNextPathName(pos);}*/
}
//保存文件对话框
const char pszFilter[] = _T("EXE Files (*.txt)|*.txt||");
CFileDialog dlgSave( FALSE, //FALSE为保存
_T(".txt"), //自动加上的扩展名
_T("Output.txt"), //默认保存的文件名
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
pszFilter, this);
//目录选择对话框
BROWSEINFO bi;
char szPathName[MAX_PATH];
char szTitle[] = "选择路径"
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = GetSafeHwnd();
bi.pszDisplayName = szPathName;
bi.lpszTitle = szTitle;
bi.ulFlags = 0x0040 ;
CString str;
CString strDir; //选择的目录
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if(idl == NULL)
{
strDir= ""
return;
}
SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH * 2));
str.ReleaseBuffer();
if(str != "" && str.GetAt(str.GetLength() - 1) != '//')
str += "//"
strDir = str;
--------------------------------------------------------------------------------------------
BROWSEINFO bi;
//TCHAR Buffer[MAX_PATH];
//初始化入口参数bi开始
bi.hwndOwner = AfxGetMainWnd()->GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = m_path;//此参数如为NULL则不能显示对话框
bi.lpszTitle = _T("选择路径");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.iImage = 0;
//初始化入口参数bi结束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
if(pIDList)
{
SHGetPathFromIDList(pIDList, m_path);
//取得文件夹路径到Buffer里
//AfxMessageBox(Buffer);
GetDlgItem(IDC_PATH)->SetWindowText(m_path);
}
=======================================================================================================
1.打开文件
(1) static char szFilter[]="Text文档(*.txt)|*.txt|Word文档(*.doc,*.rtf)|*.doc;*rtf|Excel文档(*.xls)|*.xls|All Files(*.*)|*.*||";
CFileDialog dlg(TRUE,"txt",NULL,OFN_HIDEREADONLY,szFilter);
if(dlg.DoModal() != IDOK)
return;
SetDlgItemText(IDC_SOUREFILEPATH_EDT,dlg.GetPathName());
(2)CFileDialog file(true,"rar",NULL,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|
OFN_EXPLORER,"RAR文件(*.rar)|*.rar",this);
if(file.DoModal()==IDOK)
{
CString path=file.GetPathName();
GetDlgItem(IDC_EDSOURCE)->SetWindowText(path);
}
2.保存文件
(1)int nPostion=0;
CString strFileName="";
CString strSimpleName="";
GetDlgItemText(IDC_SOUREFILEPATH_EDT,strFileName);
nPostion=strFileName.ReverseFind('\\');
strSimpleName=strFileName.Right(strFileName.GetLength()-nPostion-1);
strSimpleName+=".huf";
static char szFilter[]="Huf压缩文档(*.huf)|*.huf|";
CFileDialog dlg(FALSE,"huf",strSimpleName,OFN_HIDEREADONLY,szFilter);
if(dlg.DoModal() != IDOK)
return;
SetDlgItemText(IDC_HUFFILEPATH_EDT,dlg.GetPathName());
(2) BROWSEINFO bi;
char buffer[MAX_PATH];
ZeroMemory(buffer,MAX_PATH);
bi.hwndOwner=GetSafeHwnd();
bi.pidlRoot=NULL;
bi.pszDisplayName=buffer;
bi.lpszTitle="选择一个文件夹";
bi.ulFlags=BIF_EDITBOX;
bi.lpfn=NULL;
bi.lParam=0;
bi.iImage=0;
LPITEMIDLIST pList=NULL;
if((pList=SHBrowseForFolder(&bi))!=NULL)
{
char path[MAX_PATH];
ZeroMemory(path,MAX_PATH);
SHGetPathFromIDList(pList,path);
GetDlgItem(IDC_EDDES)->SetWindowText(path);
}
3.压缩文件
CString des,temp,path,rarpath;
GetDlgItem(IDC_EDDES)->GetWindowText(des);
path.Format("%s\\*.*",des);
rarpath.Format("%s\\mingrisoft.rar",des);
temp.Format("a %s %s",rarpath,path);
::ShellExecute(NULL,"open","WinRar.exe",temp,NULL,SW_SHOW);
4.解压文件
CString source,path,temp;
GetDlgItem(IDC_EDSOURCE)->GetWindowText(source);
int pos=source.Find(".");
path=source.Left(pos);
temp.Format("X %s %s",source,path);
::CreateDirectory(path,NULL);
::ShellExecute(NULL,"open","WinRar.exe",temp,NULL,SW_SHOW);