本帖最后由 baokuishhuai 于 2012-07-12 21:01:37 编辑

解决方案 »

  1.   


    // FileMngDlg.cpp : 实现文件
    //#include "stdafx.h"
    #include "FileMng.h"
    #include "FileMngDlg.h"
    #include "RenameDlg.h"
    #include <cstringt.h>
    #include "afxdialogex.h"
    #include <tchar.h>#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
    {
    public:
    CAboutDlg();// 对话框数据
    enum { IDD = IDD_ABOUTBOX }; protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
    protected:
    DECLARE_MESSAGE_MAP()
    };CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    // CFileMngDlg 对话框
    CFileMngDlg::CFileMngDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CFileMngDlg::IDD, pParent)
    , m_bHideFile(FALSE)
    , m_bSysFile(FALSE)
    , m_nDelOpt(0)
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }void CFileMngDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_DIRPATH, m_ctrlDirPath);
    DDX_Control(pDX, IDC_DIRTREE, m_ctrlDirTree);
    DDX_Check(pDX, IDC_CHECK1, m_bHideFile);
    DDX_Check(pDX, IDC_CHECK2, m_bSysFile);
    DDX_Radio(pDX, IDC_DELOPT, m_nDelOpt);
    DDX_Control(pDX, IDC_FILELIST, m_ctrlFileList);
    }BEGIN_MESSAGE_MAP(CFileMngDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_NOTIFY(TVN_SELCHANGED, IDC_DIRTREE, &CFileMngDlg::OnTvnSelchangedDirtree)
    ON_NOTIFY(TVN_ITEMEXPANDING, IDC_DIRTREE, &CFileMngDlg::OnTvnItemexpandingDirtree)
    ON_NOTIFY(NM_CLICK, IDC_FILELIST, &CFileMngDlg::OnClickFilelist)
    ON_NOTIFY(NM_DBLCLK, IDC_FILELIST, &CFileMngDlg::OnDblclkFilelist)
    ON_BN_CLICKED(IDC_STEPTO, &CFileMngDlg::OnClickedStepto)
    ON_CBN_SELCHANGE(IDC_DIRPATH, &CFileMngDlg::OnSelchangeDirpath)
    ON_BN_CLICKED(IDC_HIDEFILE, &CFileMngDlg::OnClickedHidefile)
    ON_BN_CLICKED(IDC_SYSFILES, &CFileMngDlg::OnClickedSysfiles)
    ON_BN_CLICKED(IDC_OPENTO, &CFileMngDlg::OnBnClickedOpento)
    ON_BN_CLICKED(IDC_RENAME, &CFileMngDlg::OnBnClickedRename)
    ON_BN_CLICKED(IDC_COPYTO, &CFileMngDlg::OnBnClickedCopyto)
    ON_BN_CLICKED(IDC_MOVETO, &CFileMngDlg::OnBnClickedMoveto)
    ON_BN_CLICKED(IDC_DELETE, &CFileMngDlg::OnBnClickedDelete)
    END_MESSAGE_MAP()
    // CFileMngDlg 消息处理程序BOOL CFileMngDlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
    //初始化按钮图标
    m_ctrlOpenTo.SubclassDlgItem(IDC_OPENTO, this);   // “打开”按钮
        m_ctrlRename.SubclassDlgItem(IDC_RENAME, this);    // “重命名”按钮
        m_ctrlCopyTo.SubclassDlgItem(IDC_COPYTO, this);     // “复制到”按钮
        m_ctrlMoveTo.SubclassDlgItem(IDC_MOVETO, this);     // “移动到”按钮
        m_ctrlDelete.SubclassDlgItem(IDC_DELETE, this);     // “删除”按钮 m_ctrlCopyTo.LoadBitmaps(IDB_BITMAP3, IDB_BITMAP4);   // 正常与按下时的位图
        m_ctrlMoveTo.LoadBitmaps(IDB_BITMAP5, IDB_BITMAP6);
        m_ctrlDelete.LoadBitmaps(IDB_BITMAP7, IDB_BITMAP8);
        m_ctrlOpenTo.LoadBitmaps(IDB_BITMAP9, IDB_BITMAP10);
        m_ctrlRename.LoadBitmaps(IDB_BITMAP11, IDB_BITMAP12); // 初始化工具提示
        m_ctrlToolTip.Create(this);                  // 创建工具提示
        m_ctrlToolTip.Activate(TRUE);              // 激活工具提示
        m_ctrlToolTip.SetDelayTime(300);            // 设置提示信息延迟时间300ms
        m_ctrlToolTip.AddTool(GetDlgItem(IDC_COPYTO), _T("复制文件(目录)到指定位置"));
        m_ctrlToolTip.AddTool(GetDlgItem(IDC_MOVETO), _T("移动文件(目录)到指定位置"));
        m_ctrlToolTip.AddTool(GetDlgItem(IDC_DELETE), _T("删除选中的文件(目录)"));
        m_ctrlToolTip.AddTool(GetDlgItem(IDC_OPENTO), _T("在外部打开该文件或目录"));
        m_ctrlToolTip.AddTool(GetDlgItem(IDC_RENAME), _T("重命名文件或目录")); // 初始化树形控件的图像列表
        m_ctrlTreeImages.Create(16, 16, ILC_COLOR32, 9, 9);   // 初始化图像列表
        m_ctrlTreeImages.Add(AfxGetApp()->LoadIcon(IDI_ICON1));// 0,桌面
        m_ctrlTreeImages.Add(AfxGetApp()->LoadIcon(IDI_ICON3));// 1,文件夹(正常)
        m_ctrlTreeImages.Add(AfxGetApp()->LoadIcon(IDI_ICON4)); // 2,文件夹(打开
        m_ctrlTreeImages.Add(AfxGetApp()->LoadIcon(IDI_ICON5)); // 3,本地磁盘
        m_ctrlTreeImages.Add(AfxGetApp()->LoadIcon(IDI_ICON6)); // 4,我的电脑
        m_ctrlTreeImages.Add(AfxGetApp()->LoadIcon(IDI_ICON7)); // 5,我的文档
        m_ctrlDirTree.SetImageList(&m_ctrlTreeImages, TVSIL_NORMAL);// 设置图像列表 m_ctrlTreeImages.Add(AfxGetApp()->LoadIcon(IDI_ICON7));// 5, 我的文档
    // 初始化树形控件
    m_hSelectItem = m_ctrlDirTree.InsertItem(_T("桌面"), 0, 0, TVI_ROOT);  // 添加桌面节点
    UpdateTreeItem(m_hSelectItem);                       // 更新桌面节点
    m_strCurrPath = GetItemPath(m_hSelectItem);    // 当前路径
    m_ctrlDirTree.SelectItem(m_hSelectItem);         // 默认选中桌面节点
    m_ctrlDirTree.Expand(m_hSelectItem, TVE_EXPAND);    // 展开桌面节点 // 初始化列表控件的图像列表
    m_ctrlListImages.Create(16, 16, ILC_COLOR32, 4, 4);
    m_ctrlListImages.Add(AfxGetApp()->LoadIcon(IDI_ICON2));// 0, 文件
    m_ctrlListImages.Add(AfxGetApp()->LoadIcon(IDI_ICON3)); // 1, 文件夹(正常)
    m_ctrlListImages.Add(AfxGetApp()->LoadIcon(IDI_ICON5));// 2, 本地磁盘
    m_ctrlFileList.SetImageList(&m_ctrlListImages, LVSIL_SMALL);// 设置图像列表 // 初始化列表控件
    m_ctrlFileList.SetExtendedStyle(LVS_EX_FULLROWSELECT);  // 整行选择
    m_ctrlFileList.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 200);
    m_ctrlFileList.InsertColumn(1, _T("大小"), LVCFMT_RIGHT, 60);
    m_ctrlFileList.InsertColumn(2, _T("类型"), LVCFMT_CENTER, 60);
    m_ctrlFileList.InsertColumn(3, _T("修改日期"), LVCFMT_LEFT, 140); return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }void CFileMngDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialogEx::OnSysCommand(nID, lParam);
    }
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CFileMngDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialogEx::OnPaint();
    }
    }//当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CFileMngDlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }BOOL CFileMngDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
    m_ctrlToolTip.RelayEvent(pMsg);           // 预处理鼠标消息    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    BOOL CFileMngDlg::DeleChildItems(HTREEITEM hItem)
    {
    HTREEITEM hChild = m_ctrlDirTree.GetChildItem(hItem); // 取得子节点
    for (; hChild; hChild = m_ctrlDirTree.GetNextItem(hItem, TVGN_CHILD))
    m_ctrlDirTree.DeleteItem(hChild);                     // 删除该节点
    return TRUE;
    }BOOL CFileMngDlg::PathHasSubDirs(CString strPath)
    {
    CFileFind finder;
    if (strPath.Right(1) != "\\") strPath += "\\";       // 路径分隔符
    for (BOOL bFind = finder.FindFile(strPath+"*.*"); bFind; )
    {
    bFind = finder.FindNextFile();               // 查找下一个文件
    if (finder.IsDots()) continue;               // 父目录,跳过
    if (!finder.IsDirectory()) continue;         // 文件,跳过
    else return finder.Close(), TRUE;             // 文件夹,关闭并结束
    }
    return finder.Close(), FALSE;                     // 不包含子文件夹
    }BOOL CFileMngDlg::UpdateItemDirs(HTREEITEM hItem)
    {
    CFileFind finder;
    CString strTemp = GetItemPath(hItem);         // 取得节点的绝对路径
    if (strTemp.Right(1) != "\\") strTemp += "\\";
    for (BOOL bFind = finder.FindFile(strTemp+"*.*"); bFind; )
    {
    bFind = finder.FindNextFile();                // 查找下一个文件
    if (finder.IsDots() || !finder.IsDirectory()) continue;   // 忽略父目录及文件
    if (finder.IsHidden() && !m_bHideFile) continue; // 跳过隐藏文件夹
    if (finder.IsSystem() && !m_bSysFile) continue;  // 跳过系统文件夹 strTemp = finder.GetFileName();                     // 取得文件夹名称
    HTREEITEM hTemp = m_ctrlDirTree.InsertItem(strTemp, 1, 2, hItem);
    if (PathHasSubDirs(finder.GetFilePath()))        // 含有子目录
    m_ctrlDirTree.InsertItem(_T(""), hTemp);          // 添加空节点
    }
    finder.Close();
    return TRUE;
    }BOOL CFileMngDlg::UpdateTreeItem(HTREEITEM hItem)
    {
    int nItem = 0;
    m_ctrlFileList.DeleteAllItems();              // 删除所有项

    if(strPath.IsEmpty())                          // 为空表示“我的电脑”
    {   // 更新磁盘信息, ……
    }
    else
    {   // 更新文件信息
    CFileFind finder;
    if (strPath.Right(1) != "\\") strPath += "\\";
    for (BOOL bFind = finder.FindFile(strPath +"*.*"); bFind; )
    {
    bFind = finder.FindNextFile();                                  // 查找下一个文件
    if (finder.IsDots()) continue;                                   // 忽略父目录
    if (finder.IsHidden() && !m_bHideFile) continue;               // 显示隐藏文件?
    if (finder.IsSystem() && !m_bSysFile) continue;                   // 显示系统文件?
    BOOL bDir = finder.IsDirectory();                                // 文件或目录
    m_ctrlFileList.InsertItem(nItem,_T(""), bDir ? 1 : 0);                // 插入一项
    m_ctrlFileList.SetItemText(nItem, 0, finder.GetFileName());
    m_ctrlFileList.SetItemText(nItem, 1, MakeSizeString(finder. GetLength()));
    m_ctrlFileList.SetItemText(nItem, 2, bDir ?_T("文件夹"):_T("文件"));
    CTime tmFile; finder.GetLastAccessTime(tmFile);               // 最后访问时间
    m_ctrlFileList.SetItemText(nItem, 3, tmFile.Format((_T("%Y年%m月%d日%H:%M"))));
    nItem++;
    }
    }
    CString strMsg;
    strMsg.Format(_T("共%d对象"), nItem);            // 找到的数目
    SetDlgItemText(IDC_MSGINFO, strMsg);          // 设置提示信息
    return TRUE;
    }
    CString CFileMngDlg::GetItemPath(HTREEITEM hItem)
    {
    CString strDir, strPath;
    HTREEITEM hTemp = hItem;
    while (hTemp != NULL)
    {
    strDir = m_ctrlDirTree.GetItemText(hTemp);       // 取得节点名
    hTemp  = m_ctrlDirTree.GetParentItem(hTemp);  // 取得父节点
    if (!strDir.CompareNoCase(_T("我的电脑"))) break;     // “我的电脑”根节点 CString strTemp = strDir;                            // 临时地址
    if (strDir.Right(1)!="\\" && !strPath.IsEmpty()) 
    strTemp += "\\";
    strPath = strTemp + strPath;                      // 构造绝对路径
    if (!strDir.CompareNoCase(_T("桌面"))) break;        // “桌面”根节点
    if (!strDir.CompareNoCase(_T("我的文档"))) break;    // “我的文档”根节点
    } char szPath[MAX_PATH] = {0};
    ::SHGetSpecialFolderPath(m_hWnd, (LPWSTR)szPath, 0, FALSE); // “桌面”的绝对路径
    strPath.Replace(_T("桌面"), (LPWSTR)szPath); ::SHGetSpecialFolderPath(m_hWnd, (LPWSTR)szPath, 5, FALSE); // “我的文档”的绝对路径
    strPath.Replace(_T("我的文档"), (LPWSTR)szPath);
    return strPath;        // 节点的绝对路径, 为空表示的是“我的电脑”
    }
    CString CFileMngDlg::MakeSizeString(DWORD dwSize)
    {
    CString strSize("");
    if (dwSize >= 1024*1024)
    strSize.Format(_T("%.1fMB"), (float)dwSize/1024/1024);
    else if (dwSize > 0)
    strSize.Format(_T("%.1fKB"), (float)dwSize/1024);
    return strSize;}BOOL CFileMngDlg::UpdateListItem(CString strPath)
    {
    int nItem = 0;
    m_ctrlFileList.DeleteAllItems();                  // 删除所有项
    if (strPath.IsEmpty())                              // 为空表示“我的电脑”
    {   // 更新磁盘信息
    char szPath[MAX_PATH] = {0};
    ::GetLogicalDriveStrings(MAX_PATH, (LPWSTR)szPath);  // 取得逻辑磁盘的卷标
    for (char *s = szPath; *s; s += strlen(s)+1)
    {
    if (::GetDriveType(s) != DRIVE_FIXED) continue; // 本地磁盘(硬盘)
    m_ctrlFileList.InsertItem(nItem,_T(""), 2); // 插入一项,硬盘图标
    m_ctrlFileList.SetItemText(nItem, 0, (LPCTSTR)(LPTSTR)s);          // 卷标
    m_ctrlFileList.SetItemText(nItem, 1, _T(""));         // 大小
    m_ctrlFileList.SetItemText(nItem, 2, _T("本地磁盘")); // 类型
    nItem++;
    }
    }
    else
    {    // 更新文件信息……
    }
    return TRUE;
    }void CFileMngDlg::OnTvnSelchangedDirtree(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    UpdateData(TRUE);
    m_hSelectItem = pNMTreeView->itemNew.hItem;     // 当前选中的节点
    m_strCurrPath = GetItemPath(m_hSelectItem);         // 该节点的绝对路径
    UpdateListItem(m_strCurrPath);                      // 更新列表控件
     
    m_ctrlDirTree.Expand(m_hSelectItem, TVE_EXPAND);  // 展开该节点
    if (m_strCurrPath.IsEmpty()) m_ctrlDirPath.AddString(_T("我的电脑"));
    else m_ctrlDirPath.AddString(m_strCurrPath);        // 添加到地址栏
    m_ctrlDirPath.SetCurSel(m_ctrlDirPath.GetCount()-1);  // 选中该地址}
    void CFileMngDlg::OnTvnItemexpandingDirtree(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    UpdateData(TRUE);
    HTREEITEM hItem = pNMTreeView->itemNew.hItem;      // 需要展开的节点
    UpdateTreeItem(hItem);                            // 更新该节点}HANDLE CFileMngDlg::GetNameItem(CString strName)
    {
    DeleChildItems(m_hSelectItem);            // 删除所有子节点
    UpdateTreeItem(m_hSelectItem);            // 重新更新节点
    HTREEITEM hItem = m_ctrlDirTree.GetChildItem(m_hSelectItem);
    while (hItem != NULL)
    {
    if (!strName.Compare(m_ctrlDirTree.GetItemText(hItem))) break;  // 找到该节点
    else hItem = m_ctrlDirTree.GetNextItem(hItem, TVGN_NEXT); // 取得下一节点
    }
    return hItem;                            // 如果找到返回该节点,否则返回NULL}
      

  3.   

    void CFileMngDlg::OnClickFilelist(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    if (pNMItemActivate->iItem == -1) return;
    int nItem = pNMItemActivate->iItem;                 // 选中的列表项
     
    CString strName = m_ctrlFileList.GetItemText(nItem, 0);// 选中项的名称
    if (!m_strCurrPath.IsEmpty() && m_strCurrPath.Right(1)!="\\") 
    m_strCurrPath+="\\";
    m_strCurrFile = m_strCurrPath + strName;            // 该文件的全路径
    m_bSelectFile = GetNameItem(strName) ? FALSE : TRUE;    // 文件或文件夹
     
    if (strName.IsEmpty()) strName("就绪");
    SetDlgItemText(IDC_MSGINFO, strName);             // 提示选中的文件信息}
    void CFileMngDlg::OnDblclkFilelist(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE> (pNMHDR);
    *pResult = 0;
    if (pNMItemActivate->iItem == -1) return;
    int nItem = pNMItemActivate->iItem;                    // 选中的列表项
     
    UpdateData(TRUE);
    CString strTemp = m_ctrlFileList.GetItemText(nItem, 0);
    HTREEITEM hItem = (HTREEITEM)GetNameItem(strTemp);  // 是否选中文件夹
    if (hItem != NULL) m_hSelectItem = hItem;            // 重新设置当前节点
     
    m_ctrlDirTree.SelectItem(m_hSelectItem);              // 使该节点被选中
    m_ctrlDirTree.Expand(m_hSelectItem, TVE_EXPAND); // 展开该节点
    UpdateListItem(GetItemPath(m_hSelectItem));        // 更新目录下的文件
    }
    void CFileMngDlg::OnClickedStepto()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateTreeItem(m_hSelectItem);           // 更新节点的目录结构
    UpdateListItem(m_strCurrPath);          // 更新路径下的文件信息
    }
    void CFileMngDlg::OnSelchangeDirpath()
    {
    // TODO: 在此添加控件通知处理程序代码
    int i = m_ctrlDirPath.GetCurSel();               // 选中项的索引
    m_ctrlDirPath.GetLBText(i, m_strCurrPath);    // 选中项的路径
    if (!m_strCurrPath.CompareNoCase(_T("我的电脑")));
    m_strCurrPath = "";                             // 根路径
    OnClickedStepto();                                 // 更新信息}
    void CFileMngDlg::OnClickedHidefile()
    {
    // TODO: 在此添加控件通知处理程序代码
    m_bHideFile = !m_bHideFile;
    UpdateTreeItem(m_hSelectItem);                         // 更新目录结构
    m_ctrlDirTree.SelectItem(m_hSelectItem);              // 选中当前节点
    m_ctrlDirTree.Expand(m_hSelectItem, TVE_EXPAND);     // 展开当前节点
    UpdateListItem(GetItemPath(m_hSelectItem));          // 更新文件列表}
    void CFileMngDlg::OnClickedSysfiles()
    {
    // TODO: 在此添加控件通知处理程序代码
    m_bSysFile = !m_bSysFile;
    UpdateTreeItem(m_hSelectItem);                     // 更新目录结构
    m_ctrlDirTree.SelectItem(m_hSelectItem);            // 选中当前节点
    m_ctrlDirTree.Expand(m_hSelectItem, TVE_EXPAND);  // 展开当前节点
    UpdateListItem(GetItemPath(m_hSelectItem));           // 更新文件列表}
    void CFileMngDlg::OnBnClickedOpento()
    {
    // TODO: 在此添加控件通知处理程序代码
    if (m_strCurrFile.IsEmpty()) return;
    ::ShellExecute(NULL, _T("open"),m_strCurrFile,_T(""),_T(""), SW_SHOWNORMAL);
    }
    void CFileMngDlg::OnBnClickedRename()
    {
    // TODO: 在此添加控件通知处理程序代码
    if (m_strCurrFile.IsEmpty()) return;                     // 未选中文件 CRenameDlg *pDlg = new CRenameDlg(this);
    pDlg->Create(IDD_RENAME_DIALOG, this);                   // 创建无模式对话框 int nLen = m_strCurrFile.GetLength();
    int nPos = m_strCurrFile.ReverseFind('\\');
    pDlg->m_strOldName  = m_strCurrFile.Right(nLen-nPos-1);  // 原文件名称
    pDlg->m_strFilePath = m_strCurrPath;  // 文件全路径 pDlg->ShowWindow(SW_SHOW); // 显示无模式对话框
    pDlg->UpdateData(FALSE);                                // 更新控件的显示数据}
    BOOL CFileMngDlg::FileOperation(UINT nFlag, CString strDest, bool bUndo)
    {
    char szFromPath[MAX_PATH] = {0};
    lstrcpy((LPWSTR)szFromPath, m_strCurrFile);

    SHFILEOPSTRUCT fo;
    ::ZeroMemory(&fo, sizeof(fo));
    fo.hwnd   = m_hWnd;                           // 父窗口句柄
    fo.wFunc  = nOpt;                              // 执行的操作
    fo.pFrom  = (LPCTSTR)(LPTSTR)szFromPath;                         // 源文件路径
    fo.pTo    = strDest;                             // 目的路径
    fo.fFlags = FOF_SIMPLEPROGRESS;               // 显示进度条
    if (bUndo) fo.fFlags |= FOF_ALLOWUNDO;       // 允许撤销
    fo.lpszProgressTitle = strDest;              // 进度条标题
    return ::SHFileOperation(&fo);}
    void CFileMngDlg::OnBnClickedCopyto()
    {
    // TODO: 在此添加控件通知处理程序代码
    if (m_strCurrFile.IsEmpty()) return;                // 未选择文件
    int nLen = m_strCurrFile.GetLength();
    int nPos = m_strCurrFile.ReverseFind('\\');

    CFileDialog dlg(FALSE, NULL, m_strCurrFile.Right(nLen-nPos-1));
    if (dlg.DoModal() != IDOK) return;                  // 弹出文件对话框
    FileOperation(FO_COPY, dlg.GetPathName(), TRUE); // 复制文件到目的路径
    }
    void CFileMngDlg::OnBnClickedMoveto()
    {
    // TODO: 在此添加控件通知处理程序代码
    if (m_strCurrFile.IsEmpty()) return;                // 未选择文件
    int nLen = m_strCurrFile.GetLength();
    int nPos = m_strCurrFile.ReverseFind('\\');

    CFileDialog dlg(FALSE, NULL, m_strCurrFile.Right(nLen-nPos-1));
    if (dlg.DoModal() != IDOK) return;                  // 弹出文件对话框
    FileOperation(FO_MOVE, dlg.GetPathName(), TRUE); // 移动文件到目的路径
    }
    void CFileMngDlg::OnBnClickedDelete()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    if (m_strCurrFile.IsEmpty()) return;                // 未选择文件

    FileOperation(FO_DELETE, _T(""), m_nDelOpt==0);         // 删除文件
    UpdateListItem(m_strCurrPath);                      // 更新文件列表
    UpdateTreeItem(m_hSelectItem);                      // 更新目录结构
    }