WTL中CFileDialog实现文件多选
来源:自学PHP网
时间:2014-09-19 14:47 作者:
阅读:次
[导读] 本文章来给各位同学介绍一个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\0*.*\0\0");
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 第二个文件名 \0 第三个文件名 \0\0。不同的文件名直接有个0,结尾处有两个0。
代码如下 |
复制代码 |
TCHAR szInitPath[MAX_PATH] = L"D:";
CFileDialog dlg (TRUE);
const int nMaxFiles = 100;
const int nBufferSize = (nMaxFiles * (MAX_PATH + 1)) + 1;
TCHAR szFileNamesBuffer[nBufferSize] = {0};
dlg.m_ofn.lpstrFile = szFileNamesBuffer;
dlg.m_ofn.nMaxFile = nBufferSize;
dlg.m_ofn.lpstrInitialDir = szInitPath;
int nResult = dlg.DoModal();
std::list<CString> lsPath;
if(nResult == IDOK)
{
if(dlg.m_ofn.nFileOffset < ::_tcslen(szFileNamesBuffer))
{
// The user chose only one files
lsPath.push_back(szFileNamesBuffer);
}
else
{
// The user chose multiple files
LPTSTR sDirectory = szFileNamesBuffer;
LPTSTR sFileName = szFileNamesBuffer + dlg.m_ofn.nFileOffset;
TCHAR sFullPath[MAX_PATH] = {0};
while(sFileName != NULL && *sFileName != _T('\0'))
{
sFullPath[0] = _T('\0');
::PathCombine(sFullPath, sDirectory, sFileName);
lsPath.push_back(sFullPath);
sFileName = sFileName + _tcslen(sFileName) + 1;
}
}
}
|
|