WTL中CFileDialog实现文件多选
我在将一个用MFC编写的工程修改为WTL工程,旧的MFC工程中有调用文件浏览器选择多个文件的代码,但是换成WTL平台之后,这部分代码是行不通的。最后我将这部分代码改成了WTL的实现方式。
MFC中使用CFileDialog实现文件多选在MFC中,可以使用下面的方法实现文件多选:
代码如下 | |
TCHAR szInitPath[MAX_PATH] = L"D:\"; CFileDialog dlg (TRUE) ; const int nMaxFiles = 100; const int nBufferSize = (nMaxFiles * (MAX_PATH + 1)) + 1; CString strFileName; dlg.m_ofn.lpstrFile = strFileName.GetBuffer(nBufferSize); dlg.m_ofn.nMaxFile = nBufferSize; dlg.m_ofn.lpstrInitialDir = szInitPath; dlg.m_ofn.Flags |= OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; dlg.m_ofn.lpstrFilter = _T("All Files *.* "); dlg.m_ofn.lpstrTitle = _T("Import Files"); int nResult = dlg.DoModal(); strFileName.ReleaseBuffer(); std::list<CString> lsPath; if(nResult == IDOK) { BOOL bHasFile = FALSE; CString strFile; POSITION pos = {0}; pos = dlg.GetStartPosition(); while(pos != NULL) { CString strPathName = dlg.GetNextPathName(pos); if (FALSE==strPathName.IsEmpty()) { lsPath.push_back(strPathName); } } } |
WTL中使用CFileDialog实现文件多选WTL中,并没有对SDK中的API进行过多的封装,所以可以通过查询SDK文档,得知WTL中CFileDialog的文件多选的实现。在使用CFileDialog显示打开文件对话框并返回之后,CFileDialog的m_szFileName成员标志着用户选择的文件信息,m_szFileName 是一个TCHAR 数组。如果用户选择了单个文件,那么m_szFileName就保存着用户选择的文件名,如果用户选择了多个文件,那么m_szFileName保存着被选中所有的文件名称信息,其的结构如下:
文件所在目录路径 第一个文件名 第二个文件名 第三个文件名 。不同的文件名直接有个0,结尾处有两个0。
代码如下 | |
TCHAR szInitPath[MAX_PATH] = L"D:"; |