6. 编写具体逻辑
6.1 数据初始化
在OnInitDialog中进行界面数据初始化
// 控件初始化 m_ImageList.Create(32, 32, ILC_COLOR32, 10, 30); // 创建图像序列CImageList对象 m_tree.SetImageList(&m_ImageList, LVSIL_NORMAL); // 为树形控件设置图像序列 HICON hIcon = theApp.LoadIcon(IDI_ICON_FILE); // 图标句柄 m_ImageList.Add(hIcon); // 图标添加到图像序列 m_tree.ModifyStyle(NULL, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS); m_hRoot = m_tree.InsertItem(_T("我的电脑")); // 插入根节点 GetLogicalDrive(m_hRoot); // 自定义函数 获取驱动 GetDriveDir(m_hRoot); // 自定义函数 获取驱动子项 m_tree.Expand(m_hRoot, TVE_EXPAND); // 展开或折叠子项列表 TVE_EXPAND展开列表 //m_list.InsertColumn(0, "序号", LVCFMT_LEFT, 40); m_list.InsertColumn(0, _T("文件名"), LVCFMT_LEFT, 300); m_list.InsertColumn(1, _T("类型"), LVCFMT_LEFT, 100); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP); m_combo.SetMinVisibleItems(6); // 设置显示的行数为5
6.2 各功能模块编写
不再一 一细分进行讲解了,全部功能代码都在下面了。
// 回退键点击事件:回退上一个路径 void CFileViewSystemDlg::OnBnClickedBack() { // TODO: 在此添加控件通知处理程序代码 CString strTemp; if (m_combo.GetCount() == 1) { MessageBox(L"提示",L"无可回退目录"); return; } m_combo.GetLBText(1, strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } if (IsDirectory(strTemp)) { m_combo.DeleteString(0); m_combo.DeleteString(0); Refresh(strTemp); } } // 进入键点击事件:进入当前下拉框所填路径 void CFileViewSystemDlg::OnBnClickedEnter() { // TODO: 在此添加控件通知处理程序代码 CString strTemp; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } if (IsDirectory(strTemp)) { Refresh(strTemp); } } // 下拉框路径改变事件:路径改变,listbox转到相应目录下 void CFileViewSystemDlg::OnCbnSelchangeDirpath() { // TODO: 在此添加控件通知处理程序代码 CString strTemp; int nIndex = m_combo.GetCurSel(); m_combo.GetLBText(nIndex, strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } if (IsDirectory(strTemp)) { Refresh(strTemp); } } // 点击展开左侧树目录事件:展现当前结点的子节点 void CFileViewSystemDlg::OnTvnItemexpandedTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 TVITEM item = pNMTreeView->itemNew; // 发送/接受当前关于树形视图项目信息 // 如果当前项 是 选中的项 不用展开 直接返回 if (item.hItem == m_hRoot) { return; } HTREEITEM hChild = m_tree.GetChildItem(item.hItem); // 获取指定位置的子项 while (hChild) { AddSubDir(hChild); // 添加子目录 hChild = m_tree.GetNextItem(hChild, TVGN_NEXT); // 获取树形控件TVGN_NEXT下兄弟项 } *pResult = 0; } // 点击选择某一项目录树结点事件:目录下内容显示到右侧目录列表中 void CFileViewSystemDlg::OnTvnKeydownTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVKEYDOWN pTVKeyDown = reinterpret_cast<LPNMTVKEYDOWN>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; } // 改变当前选中目录树结点事件:目录下内容显示到右侧目录列表中,展示当前树子节点 void CFileViewSystemDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 m_list.DeleteAllItems(); // 清空右侧列表 TVITEM item = pNMTreeView->itemNew; if (item.hItem == m_hRoot) { return; } CString str = GetFullPath(item.hItem); if (str.Right(1) != "\\") { str += "\\"; } // 添加到下拉框中 m_combo.InsertString(0,str); m_combo.SetCurSel(0); str += "*.*"; CFileFind file; BOOL bContinue = file.FindFile(str); // 右侧显示目录下文件(夹) while (bContinue) { bContinue = file.FindNextFileW(); if (!file.IsDots()) // 文件名是否是包含"."或".." { SHFILEINFO info = {0}; // 存文件的信息 CString tmp = str; int index = tmp.Find(_T("*.*")); tmp.Delete(index, 3); // 删除后缀 SHGetFileInfo(tmp+file.GetFileName(),0,&info,sizeof(&info), SHGFI_DISPLAYNAME | SHGFI_ICON); // 获取文件信息 int i = m_ImageList.Add(info.hIcon); m_list.SetImageList(&m_ImageList,LVSIL_SMALL); m_list.InsertItem(i, info.szDisplayName, i); } } *pResult = 0; } // 目录列表中鼠标左键双击事件: void CFileViewSystemDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 NM_LISTVIEW* pNMListCtrl = (NM_LISTVIEW*)pNMHDR; // 该变量是个结构体指针,该结构体中存放着双击的行号(iItem),以及列号(iSubItem),当未选中时返回-1 int nItem = pNMListCtrl->iItem; // 行号 // 判断双击内容是否存在 if (nItem >= 0 && nItem < m_list.GetItemCount()) { CString str_tmp; m_combo.GetWindowText(str_tmp); if (str_tmp.Right(1) != "\\") { str_tmp += "\\"; } str_tmp += m_list.GetItemText(nItem, 0); // 选中行的第1项,索引为0 Refresh(str_tmp); // 调用刷新函数 刷新列表 } *pResult = 0; } // 目录列表中鼠标右键点击事件 void CFileViewSystemDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 // 没有选中某一项的时候:展开 新建粘贴刷新 if (pNMItemActivate->iItem == -1) { POINT m_point1; GetCursorPos(&m_point1); CMenu menu; menu.LoadMenu(IDR_NEWFILE_EDIT); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, m_point1.x, m_point1.y, this); return; } // 选中某一项时候:展开 打开复制删除 POINT m_point2; GetCursorPos(&m_point2); int x = m_list.GetSelectionMark(); CMenu menu; menu.LoadMenu(IDR_POPUP_EDIT); CMenu* pop = menu.GetSubMenu(0); pop->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, m_point2.x, m_point2.y, this); *pResult = 0; } // 双击打开 void CFileViewSystemDlg::OnOpen() { int nItem = m_list.GetSelectionMark(); if (nItem >= 0 && nItem < m_list.GetItemCount()) // 判断双击内容是否存在 { CString strTemp; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } strTemp += m_list.GetItemText(nItem, 0); // 选中行的第1项,索引为0 Refresh(strTemp); } } // 右键文件复制 void CFileViewSystemDlg::OnCopy() { int nItem = m_list.GetSelectionMark(); if (nItem >= 0 && nItem < m_list.GetItemCount()) // 判断选中内容是否存在 { CString strTemp, curStr; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } curStr = strTemp; strTemp += m_list.GetItemText(nItem, 0); // 选中行的第1项,索引为0 //dir_path = strTemp; CopyToClipboard(strTemp); } } // 右键删除 void CFileViewSystemDlg::OnDelete() { int nItem = m_list.GetSelectionMark(); if (nItem >= 0 && nItem < m_list.GetItemCount()) { CString strTemp, curStr; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } curStr = strTemp; strTemp += m_list.GetItemText(nItem, 0); // 如果是目录删除目录,如果是文件删除文件 if (GetFileAttributes(strTemp) & FILE_ATTRIBUTE_DIRECTORY) { DeleteFolder(strTemp); } else { DeleteFile(strTemp); } Refresh(curStr); } } // 右键新建文件夹 void CFileViewSystemDlg::OnNewfile() { CString str; m_combo.GetWindowText(str); if (str.Right(1) != "\\") { str += "\\"; } str += _T("新建文件夹1"); while (PathIsDirectory(str)) { str.Delete(str.GetLength() - 1, 1); CString chg; chg.Format(_T("%d"), f_cnt); str += chg; f_cnt++; } if (!PathIsDirectory(str)) { CreateDirectory(str, NULL); // 创建目录,已有的话不影响 } CString strTemp; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } Refresh(strTemp); } // 右键新建txt void CFileViewSystemDlg::OnTxt() { CString str; m_combo.GetWindowText(str); if (str.Right(1) != "\\") { str += "\\"; } str += _T("新建文本文档1.txt"); while (PathFileExists(str)) { CString chg; chg.Format(_T("%d"), t_cnt); str.SetAt(str.Find(_T(".")) - 1, chg.GetAt(0)); t_cnt++; } CFile file(str, CFile::modeCreate); file.Close(); CString strTemp; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } Refresh(strTemp); } // 右键新建Docx void CFileViewSystemDlg::OnDocx() { CString str; m_combo.GetWindowText(str); if (str.Right(1) != "\\") { str += "\\"; } str += _T("新建DOCX文档1.docx"); while (PathFileExists(str)) { CString chg; chg.Format(_T("%d"), d_cnt); str.SetAt(str.Find(_T(".")) - 1, chg.GetAt(0)); d_cnt++; } CFile file(str, CFile::modeCreate); file.Close(); CString strTemp; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } Refresh(strTemp); } // 右键刷新 void CFileViewSystemDlg::OnRefresh() { CString strTemp; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } Refresh(strTemp); } // 右键粘贴 void CFileViewSystemDlg::OnPaste() { CString str; m_combo.GetWindowText(str); if (str.Right(1) != "\\") { str += "\\"; } PasteToFile(str); // 调用粘贴 CString strTemp; m_combo.GetWindowText(strTemp); if (strTemp.Right(1) != "\\") { strTemp += "\\"; } Refresh(strTemp); } // 删除文件夹 bool CFileViewSystemDlg::DeleteFolder(LPCTSTR pstrFolder) { if ((NULL == pstrFolder)) { return FALSE; } // 检查输入目录是否是合法目录 if (!IsDirectory(pstrFolder)) { return FALSE; } // 创建源目录中查找文件的通配符 CString strWildcard(pstrFolder); if (strWildcard.Right(1) != _T('\\')) { strWildcard += _T("\\"); } strWildcard += _T("*.*"); // 打开文件查找,查看源目录中是否存在匹配的文件 // 调用FindFile后,必须调用FindNextFile才能获得查找文件的信息 CFileFind finder; BOOL bWorking = finder.FindFile(strWildcard); while (bWorking) { // 查找下一个文件 bWorking = finder.FindNextFile(); // 跳过当前目录“.”和上一级目录“..” if (finder.IsDots()) { continue; } // 得到当前目录的子文件的路径 CString strSubFile = finder.GetFilePath(); // 判断当前文件是否是目录, // 如果是目录,递归调用删除目录, // 否则,直接删除文件 if (finder.IsDirectory()) { if (!DeleteFolder(strSubFile)) { finder.Close(); return FALSE; } } else { if (!DeleteFile(strSubFile)) { finder.Close(); return FALSE; } } } // 关闭文件查找 finder.Close(); // 删除当前空目录 return RemoveDirectory(pstrFolder); } // 判断目录是否存在 bool CFileViewSystemDlg::IsDirectory(LPCTSTR pstrPath) { if (NULL == pstrPath) { return FALSE; } // 去除路径末尾的反斜杠 CString strPath = pstrPath; if (strPath.Right(1) == _T('\\')) { strPath.Delete(strPath.GetLength() - 1); } CFileFind finder; BOOL bRet = finder.FindFile(strPath); if (!bRet) { return FALSE; } // 判断该路径是否是目录 finder.FindNextFile(); bRet = finder.IsDirectory(); finder.Close(); return bRet; } // 路径赋值 void CFileViewSystemDlg::CopyToClipboard(CString dirPath) { dir_path = dirPath; } // 粘贴文件 void CFileViewSystemDlg::PasteToFile(CString dirPath) { if (GetFileAttributes(dir_path) & FILE_ATTRIBUTE_DIRECTORY) { dirPath += _T("新建文件夹1"); while (PathIsDirectory(dirPath)) { dirPath.Delete(dirPath.GetLength() - 1, 1); CString chg; chg.Format(_T("%d"), f_cnt); dirPath += chg; f_cnt++; } if (!PathIsDirectory(dirPath)) { CreateDirectory(dirPath, NULL); // 创建目录,已有的话不影响 } if (dirPath.Right(1) != "\\") // 目录的最右边需要“\”字符 dirPath += "\\"; CFileFind filefind; CString path = dir_path; if (path.Right(1) != "\\") // 目录的最右边需要“\”字符 path += "\\"; path += "*.*"; BOOL res = filefind.FindFile(path); while (res) { res = filefind.FindNextFile(); if (!filefind.IsDirectory() && !filefind.IsDots()) { CopyFile(filefind.GetFilePath(), dirPath + filefind.GetFileName(), TRUE); // 如果目标已经存在,不拷贝(True)并返回False,覆盖目标(false) } } filefind.Close(); } else { CString type = dir_path; CString filename = type.Right(type.GetLength() - type.ReverseFind('\\') - 1); dirPath += filename; while (PathFileExists(dirPath)) { CString chg; chg.Format(_T("%d"), t_cnt); dirPath.SetAt(dirPath.Find(_T(".")) - 1, chg.GetAt(0)); t_cnt++; } CopyFile(dir_path, dirPath, TRUE); // 如果目标已经存在,不拷贝(True)并返回False,覆盖目标(false) } } // 获取系统分区驱动器字符串信息 void CFileViewSystemDlg::GetLogicalDrive(HTREEITEM hParent) { TCHAR szBuf[100]; memset(szBuf, 0, 100); DWORD len = GetLogicalDriveStrings(sizeof(szBuf) / sizeof(TCHAR), szBuf); for (TCHAR* s = szBuf; *s; s += _tcslen(s) + 1) { CString k = s; m_tree.InsertItem(k, hParent); } } // 获取目录下所有子项 void CFileViewSystemDlg::GetDriveDir(HTREEITEM hParent) { HTREEITEM hChild = m_tree.GetChildItem(hParent); while (hChild) { CString strText = m_tree.GetItemText(hChild); // 检索列表中项目文字 if (strText.Right(1) != "\\") // 从右边1开始获取从右向左nCount个字符 strText += _T("\\"); strText += "*.*"; // 将当前目录下文件枚举并InsertItem树状显示 CFileFind file; // 定义本地文件查找 BOOL bContinue = file.FindFile(strText); // 查找包含字符串的文件 while (bContinue) { bContinue = file.FindNextFile(); // 查找下一个文件 if (file.IsDirectory() && !file.IsDots()) // 找到文件为内容且不为点"." m_tree.InsertItem(file.GetFileName(), hChild); // 添加盘符路径下树状文件夹 } GetDriveDir(hChild); // 递归调用 hChild = m_tree.GetNextItem(hChild, TVGN_NEXT); // 获取树形控件TVGN_NEXT下兄弟项 } } // 获取树项目全根路径 CString CFileViewSystemDlg::GetFullPath(HTREEITEM hCurrent) { CString str_Tmp; CString str_Retrun; while (hCurrent != m_hRoot) { str_Tmp = m_tree.GetItemText(hCurrent); if (str_Tmp.Right(1)!="\\") { str_Tmp += "\\"; } str_Retrun = str_Tmp + str_Retrun; hCurrent = m_tree.GetParentItem(hCurrent); // 返回父项目句柄 } return str_Retrun; } // 添加子目录 void CFileViewSystemDlg::AddSubDir(HTREEITEM hParent) { CString strPath = GetFullPath(hParent); // 获取全路径 if (strPath.Right(1) != "\\") strPath += "\\"; strPath += "*.*"; CFileFind file; BOOL bContinue = file.FindFile(strPath); // 查找包含字符串的文件 while (bContinue) { bContinue = file.FindNextFile(); // 查找下一个文件 if (file.IsDirectory() && !file.IsDots()) { m_tree.InsertItem(file.GetFileName(), hParent); } } } // 刷新/更新ListCtrl void CFileViewSystemDlg::Refresh(CString str) { // 目录的文件系统的属性:如果是目录 就展开操作 if (GetFileAttributes(str) & FILE_ATTRIBUTE_DIRECTORY) { m_combo.InsertString(0, str); m_combo.SetCurSel(0); if (str.Right(1) != "\\") { str += "\\"; } str += "*.*"; CFileFind file; BOOL bContinue = file.FindFile(str); m_list.DeleteAllItems(); while (bContinue) { bContinue = file.FindNextFileW(); if (!file.IsDots()) { SHFILEINFO info = { 0 }; CString temp = str; int index = temp.Find(_T("*.*")); temp.Delete(index, 3); SHGetFileInfo(temp + file.GetFileName(), 0, &info, sizeof(&info), SHGFI_DISPLAYNAME | SHGFI_ICON); int i = m_ImageList.Add(info.hIcon); m_list.SetImageList(&m_ImageList, LVSIL_SMALL); m_list.InsertItem(i, info.szDisplayName, i); } } } // 是文件就打开他 else { if (PathFileExists(str)) ShellExecute(NULL, TEXT("OPEN"), str, NULL, NULL, SW_SHOWNORMAL); // 调用外部程序打开文件 } }