注意事项:
一、 最重要的一点:CfileDialog::DoModal()后会将当前的工作路径改变为打开文档处的路径,所以对于那些用相对路径定位的数据库连接操作或dll导入操作都是致命的,解决的最佳办法是在CfileDialog未创建的时候保存当前的工作路径,在CfileDialog::DoModal()==IDOK后,将工作路径改回来
二、 在最后注意空间的释放
三、 下面是多选打开对话框的实现
CString currentDirectory=L"";
TCHAR currentDir[1024]={0};
GetCurrentDirectory(1024,currentDir);
currentDirectory=currentDir;//将工作路径保存起来,因为在CFileDlg::DoModal()后会更改当前的工作路径,由于我们程序全部用的相对路径,所以后面的各种应用都会报错
CFileDialog fd(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT ,_T("Excel files(*.xls)|*.xls|"));
DWORD MAXFILE = 40000; //初始化空间大小,若超过初始化空间,程序fd.DoModal()会自己返回IDCANCEL值
fd.m_ofn.nMaxFile = MAXFILE;
TCHAR * pc = new TCHAR[MAXFILE]; //定义为T类型,可避免转换
USES_CONVERSION;
fd.m_ofn.lpstrFile = pc;
fd.m_ofn.lpstrFile[0] = NULL; //对文件选择对话框初始化
CString parth=_T("1"); //The SHBrowseForFolder Dialog Box 选择文件夹类
int i;
int len;
if (IDOK == fd.DoModal())
{
POSITION pos=fd.GetStartPosition();
CString t_strFormat;
while(pos!=NULL)
{
parth=fd.GetNextPathName(pos);
this->m_fileDirArray.Add(parth); //保存每个文件的完整路径
len=parth.GetLength();
i=parth.ReverseFind('\\');
i=len-i;
parth=parth.Right(i-1);
m_excelList.AddString(parth); //得到所有文件名
t_strFormat=parth;
parth.Format(_T("添加文件:%s"),t_strFormat);
this->m_status.SetWindowTextW(parth);
// ::SendMessageA(this->m_hWnd,WM_PAINT,0,0);//发送重绘消息
}
this->m_status.SetWindowTextW(_T("搜索完成"));
}
delete []pc; //注意删除
::SetCurrentDirectoryW(currentDir); //将工作路径设置回来,因为第一次点击CFileDlg::DoModal()后会将工作路径变为选择文档的工作路径
最后,项目心情记,与技术无关