//////////////////////////////////////////////////////////////////////////
///////// ***以下四个函数与源树或源列表的消息通告有关*** /////////
//////////////////////////////////////////////////////////////////////////---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;
评论