网站地图    收藏   

主页 > 前端 > javascript >

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;
    }
  }
}

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论