MFC模拟 Windows 文件可视化系统(下)

简介: MFC模拟 Windows 文件可视化系统

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); // 调用外部程序打开文件
  }
}
相关文章
|
3月前
|
安全 Windows
永久关闭 Windows 11 系统更新
永久关闭 Windows 11 系统更新
168 0
|
2月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
75 32
|
2月前
|
存储 负载均衡 Java
如何配置Windows主机MPIO多路径访问存储系统
Windows主机多路径(MPIO)是一种技术,用于在客户端计算机上配置多个路径到存储设备,以提高数据访问的可靠性和性能。本文以Windows2012 R2版本为例介绍如何在客户端主机和存储系统配置多路径访问。
124 13
如何配置Windows主机MPIO多路径访问存储系统
|
3月前
|
存储 开发框架 .NET
Windows IIS中asp的global.asa全局配置文件使用说明
Windows IIS中asp的global.asa全局配置文件使用说明
55 1
|
3月前
|
Windows
Windows系统命令dir使用详解
Windows系统命令dir使用详解
190 2
|
3月前
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
1351 1
|
3月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
3月前
|
Apache 数据中心 Windows
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
|
3月前
|
域名解析 缓存 网络协议
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
|
3月前
|
运维 网络安全 虚拟化
Windows系统镜像检测修复建议
Windows系统镜像检测修复建议