CFileDialog实现复选文件

  最近在写一个小工具,用到了CFileDialog,用来实现复选文件名。
   按照一般的做法:
    CFileDialog SELECTDIALOG(TRUE, "", NULL,
    OFN_ALLOWMULTISELECT|OFN_OVERWRITEPROMPT,  
    "*.*|*.*|所有文件(*.*)|*.*|", NULL);
   SELECTDIALOG.m_ofn.lpstrTitle = "请选择该组件内包含的文件(***友情提醒:支持复选***)";
   SELECTDIALOG.m_ofn.lpstrInitialDir = "...";

   SELECTDIALOG.DoModal();
     这样的话只能支持单选文件,无法实现复选,查了下msdn,加了如下代码:
    CString szFile = "";
   CString szFileName = "";
   POSITION pon;

   pon = SELECTDIALOG.GetStartPosition();

   while (NULL != pon)
    {
     szFile = SELECTDIALOG.GetNextPathName(pon);
    szFileName = GetFileName(szFile);
    if (szFileName == "")
    {
     continue;
    }
    else
    {
     ComponentFile.push_back(szFileName);
    }
    }
     因为只需要得到文件名,路径不需要,所以加了个 CString GetFileName(CString szFile)滤去路径。
     CString CSetComponentListDlg::GetFileName(CString szFile)
   {
    char PathTemp[256] = "";
    char FileName[256] = "";
    strncpy(PathTemp, szFile, sizeof(PathTemp));
   
       for (int i = 0, j = 0, flag = 0; i < sizeof(PathTemp); i ++)
       {
         if (PathTemp[i] != '//')
         {
             FileName[j] = PathTemp[i];
         j ++;
         }
        else
       {
        flag = i;
        j = 0;
        strcpy(FileName, "");
       }
       }
    return FileName;
   }
     编译,ok,测试下,出问题了: 能支持复选,读进来的文件名也对,可是很奇怪,只能同时复选12个左右的文件,
     一次选择多于12个文件就会出错,百思不得奇解,继续查msdn,原来有个文件缓存用来放这些文件名,文件缓存
     默认状态下比较小,放的文件名多了就溢出了。
     把开头那段加入文件缓存的定义:
    char FileBuff[6400] = "";    
   CFileDialog SELECTDIALOG(TRUE, "", NULL,
    OFN_ALLOWMULTISELECT|OFN_OVERWRITEPROMPT,  
    "*.*|*.*|所有文件(*.*)|*.*|", NULL);
   SELECTDIALOG.m_ofn.lpstrTitle = "请选择该组件内包含的文件(***友情提醒:支持复选***)";
   SELECTDIALOG.m_ofn.lpstrInitialDir = "...";
   SELECTDIALOG.m_ofn.lpstrFile = FileBuff;  
   SELECTDIALOG.m_ofn.nMaxFile = sizeof(FileBuff);  

   SELECTDIALOG.DoModal();
      重新编译,测试,一切ok。
      总结一下: 即使是个很小的东西也有很多讲究的地方。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值