注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

MFC--目录树与目录列表的关联动作  

2012-09-04 01:26:52|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//////////////////////////////////////////////////////////////////////////
/////////   ***以下四个函数与源树或源列表的消息通告有关***     /////////
//////////////////////////////////////////////////////////////////////////---zwh--注:源目录树展开时的消息处理函数;
void CBackupToolDlg::OnTvnItemexpandedSrcTree(NMHDR* pNMHDR, LRESULT* pResult)   //展开目录树时的消息通告;如果用递归一次性将所有文件找出来,如果文件多且目录深度较深,则会很慢;
{
 //======================功能概要:展开目录树节点的事件处理=====================//
 /*
 * 功能:在目录树控件(CTreeCtrl)中展开目录树的事件处理(源目录树);
 */
 //================================================================//

 LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
 // TODO: 在此添加命令处理程序代码
 
 TVITEM item = pNMTreeView->itemNew;
 if (item.hItem==m_hSrcRoot)
 {
  return ;
 }
 HTREEITEM hChild = m_srcTree.GetChildItem(item.hItem);  //如果有子目录,则添加子目录,只在展开时添加其子节点;
 while (hChild)
 {
  AddSubDir(hChild);  //添加子目录;
  hChild = m_srcTree.GetNextItem(hChild,TVGN_NEXT);
 }
 *pResult = 0;
}
//////////////////////////////////////////////////////////////////////////---zwh;
//////////////////////////////////////////////////////////////////////////---zwh--注:选择源目录树中的项时的消息处理函数;
void CBackupToolDlg::OnTvnSelchangedSrcTree(NMHDR* pNMHDR, LRESULT* pResult)   //单击某一项时,右侧的目录列表显示相应的文件及其子文件夹;
{
 //======================功能概要:选择目录树的节点的事件处理=====================//
 /*
 * 功能:在目录树控件(CTreeCtrl)中选择树节点的事件处理(源目录树);
 */
 //================================================================//

 LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
 *pResult = 0;
 // TODO: 在此添加命令处理程序代码

 m_srcList.DeleteAllItems();  //显示前先将之前目录列表的清空;

 TVITEM item = pNMTreeView->itemNew;
 if (item.hItem==m_hSrcRoot)
 {
  GetDlgItem(IDC_SRC_LIST_CURRENTDIR)->SetWindowText(_T(""));
  GetDlgItem(IDC_BTN_REBACK)->EnableWindow(FALSE);
  return ;
 }
 else
 {
  GetDlgItem(IDC_BTN_REBACK)->EnableWindow(TRUE);
 }
 CString str = GetFullPath(item.hItem);  //拿到所选文件夹的全路径;并以此为根,将其子目录及文件显示到目录列表中去;
 m_strActiveSrcPath = str;  //保存当前活动全路径;
 if (str.Right(1)!="\\")
 {
  str += "\\";
 }
 str += "*.*";
 ForeachSrcDir(str);

}
//////////////////////////////////////////////////////////////////////////---zwh;
//////////////////////////////////////////////////////////////////////////---zwh--注:双击源目录列表中项目时的消息处理函数;
void CBackupToolDlg::OnNMDblclkSrcList(NMHDR *pNMHDR, LRESULT *pResult)  //双击文件或文件夹时的消息通告函数;
{
 //======================功能概要:双击事件处理=====================//
 /*
 * 功能:在目录列表控件(CListCtrl)中双击的事件处理(源目录列表);
 */
 //================================================================//

 // TODO: 在此添加控件通知处理程序代码
 *pResult = 0;

 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

 int nSel=pNMItemActivate->iItem;
 if (-1==nSel)  //双击空白区域;
 {
  return;
 }

 CString selStrItem=m_srcList.GetItemText(nSel,0);//将双击打开的某个项(如文件夹)的路径拿到;
 selStrItem = m_strActiveSrcPath + selStrItem;
 CString temp = selStrItem;  //保留现场;
 if (selStrItem.Right(1)!="\\")
 {
  selStrItem+="\\";
 }
 selStrItem+="*.*";
 CFileFind fileFinder;
 BOOL bFile = fileFinder.FindFile(selStrItem);
 if(bFile)
 { 
  m_strActiveSrcPath = temp + _T("\\");  //保存当前活动全路径;  
  m_srcList.DeleteAllItems();  //显示前先将之前的清空;
  fileFinder.Close();
  ForeachSrcDir(selStrItem);//遍历目录;
 }
 else
 {
  AfxMessageBox(_T("这是一个文件,如果要修改,请在本软件外操作打开!"));
 }

}
//////////////////////////////////////////////////////////////////////////---zwh;
//////////////////////////////////////////////////////////////////////////---zwh--注:遍历子目录的功能函数,因为有多个函数用到这部分相同的代码,故将它分拆出来单独作一个函数;
void CBackupToolDlg::ForeachSrcDir(CString str)// 遍历目录
{
 //=======================功能概要:遍历当前目录==============================//
 /*
 * input:当前目录;
 * output:在列表中显示当前目录下的所有文件及文件夹;
 * 功能:当单击目录树中某个子树时,在另一目录列表中显示当前目录中的所有文件及文件夹;
 */
 //==========================================================================//

 GetDlgItem(IDC_SRC_LIST_CURRENTDIR)->SetWindowText(m_strActiveSrcPath.GetBuffer());
 CFileFind file;
 BOOL b = file.FindFile(str);
 while(b)
 {
  b = file.FindNextFile();
  int i=0;

  if (!file.IsDots())  //当为文件或文件夹时;
  {
   CString temp = str;
   i = temp.Find("*.*");
   temp.Delete(i,3);  //temp拿到如C:\windows\*.*中的C:\windows\;

   temp = temp+file.GetFileName();  //temp拿到了子文件夹的全路径;如C:\windows\system32;

   SHFILEINFO fileinfo;
   SHGetFileInfo(temp,FILE_ATTRIBUTE_NORMAL,&fileinfo,sizeof(&fileinfo),SHGFI_DISPLAYNAME | SHGFI_ICON);  //拿到文件夹的属性等信息并保存在相关的结构体中;
   i = m_imageSrcList.Add(fileinfo.hIcon);  //拿到文件/文件夹的图标,并记录其在图标列表中的索引号;
   m_srcList.InsertItem(i,fileinfo.szDisplayName,i);  //插入文件/文件夹至目录列表;
  }
 }//--end--while
}
//////////////////////////////////////////////////////////////////////////---zwh;

  评论这张
 
阅读(652)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018