CfileDialog的使用方法与注意事项及多选打开对话框的创建
2012-07-03 21:57
381 查看
注意事项:
一、 最重要的一点:CfileDialog::DoModal()后会将当前的工作路径改变为打开文档处的路径,所以对于那些用相对路径定位的数据库连接操作或dll导入操作都是致命的,解决的最佳办法是在CfileDialog未创建的时候保存当前的工作路径,在CfileDialog::DoModal()==IDOK后,将工作路径改回来
二、 在最后注意空间的释放
三、 下面是多选打开对话框的实现
最后,项目心情记,与技术无关
一、 最重要的一点: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()后会将工作路径变为选择文档的工作路径
最后,项目心情记,与技术无关
由于在点击CFileDlg的OK按钮后,工作路径就会变为选择文件的路径,由于在ImportDlg中,使用的是GetCurWorkingDir来连接数据库的由于数据库连接函数是写在初始化函数中,所以改变当前工作路径对第一个对话框是没有影响的,但对于再次产生的对话框就死翘翘了,所以在致使在再次生成同样的对话框时,原应该是根本连不上数据库,但更悲催的事来了,在打开文档的那个文件夹内有一个同名的数据库mdb2.db,所以连上了,这就错过了最初的问题存在点,但到最后执行一个数据库语句时,就始终报错,我原以为是语句写错了,就这样试了一遍又一遍,换各种方法的试,就这样弄了一个下午,去吃饭,走在路上的时候,才想到应该是导入对话框的问题,因为第一次执行是一点问题没有的,所以坚决地拿出原来的开发阶段,有这块功能的最初版本,把代码一点点的注释掉,到最后定位到一句代码上,CFileDlg::DoModal(),该死的MSDN,根本没说改变工作路径这一回事啊
相关文章推荐
- 使用eclipse 开发 嵌入式Linux驱动(注意事项)(make:***没有规则可言创建目标"all".停止 的解决方法)
- 常用sql命令@oracle数据类型概括@权限、角色、用户的创建于使用@伪列及其注意事项
- Linux任务调度进程crontab的使用方法和注意事项
- CFileDialog使用注意事项GetFileName()和GetPathName();
- UISearchController使用方法及注意事项
- List 的subList()方法使用注意事项
- GetComponentInChildren方法的使用注意事项
- cygwin跨平台移植 gcc+vc联合使用的方法和注意事项
- 创建和使用存储过程的注意事项
- elasticsearch中client.transport.sniff的使用方法和注意事项
- android使用代码生成LayerDrawable的方法和注意事项
- 为什么用group by 以及使用的方法和注意事项
- iPhone SDK中多线程的使用方法以及注意事项
- BufferedWriter的使用方法分和注意事项
- 函数的创建及使用时的注意事项
- Timer类中两个schedule方法使用的注意事项
- 使用OpenSSL工具制作X.509证书的方法及其注意事项总结
- Lambda表达式Contains方法(等价于SQL语句中的like)使用注意事项
- 使用NSSearchPathForDirectoriesInDomains等获取路径的方法时的注意事项
- C++中ifstream使用笔记(一)(常用方法和注意事项)