百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> WTL中CFileDialog实现文件多选
分享文章到:

WTL中CFileDialog实现文件多选

发布时间:01/15 来源: 浏览: 关键词:
本文章来给各位同学介绍一个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:";
 
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(''))
    {
      sFullPath[0] = _T('');
      ::PathCombine(sFullPath, sDirectory, sFileName);
 
      lsPath.push_back(sFullPath);
 
      sFileName = sFileName + _tcslen(sFileName) + 1;
    }
  }
}

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有4人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板