MFC树型控件浏览文件目录(二)--双击打开文件

今天我们来实现在树型控件中双击打开文件的操作,注意这里只是打开文件,并没有打开文件夹(不过你想打开也非常简单)。
1、判断鼠标点击了树的哪个节点;
2、根据点击的节点找到对应的文件;
3、将找到的文件打开。

下面我们一个个来。
1、判断鼠标点击了哪个节点
这步几行代码就可以搞定了,如下:在MyTreeDlg.cpp中添加的函数定义,函数声明请自己添加,就在CMyTreeDlg类中;
这里用到了HitTest方法,简单说就是通过鼠标坐标判断点击了哪个树节点,具体的细节可以网上搜索,这里就不详细叙述了。
HTREEITEM CMyTreeDlg::GetSelectTree()
{
    CPoint pt;
    GetCursorPos(&pt);//得到当前鼠标的位置
    m_MyTree.ScreenToClient(&pt);//将屏幕坐标转换为客户区坐标
    HTREEITEM tree_Item = m_MyTree.HitTest(pt);//调用HitTest找到对应点击的树节点
    return tree_Item;
}

2、根据点击的节点找到对应的文件
实际这个和第一回里介绍的遍历文件方法差不多,只不过这次,我们是从树中计算出文件的路径,然后拿着这个路径去找文件,而先前的遍历是先搜索文件,再显示成树节点,两者正好是反的操作。这里采用的获取文件路径的方法,是通过树一层层往上找的,然后再连接起来,如果有更好的方法,希望告知,非常感谢!
直接上代码:

const DWORD Error_FileOrFolderNotFound = -1;//自定义返回码,表示未找到
const DWORD Return_IsFolder = 1;//自定义返回码,表示树节点对应为文件夹
const DWORD Return_IsFile = 0;//自定义返回码,表示树节点对应为文件
DWORD CMyTreeDlg::GetFilePathByTreeItem()
{
    //临时变量
    bool IsDirectory;
    CString str_TempDir;
    HTREEITEM tree_CurTreeTemp;

    //获取到当前鼠标选择的树节点
    m_CurTree = GetSelectTree();

    if (m_CurTree == NULL)
    {
        AfxMessageBox(L"获取当前树节点失败!!");
    }
    tree_CurTreeTemp = m_CurTree;

    //获取当前节点的父节点,以便得到文件路径
    m_CurTreeParent = m_MyTree.GetParentItem(m_CurTree);
    str_TempDir = m_MyTree.GetItemText(m_CurTree);

    //为根节点时不作处理
    if (!str_TempDir.IsEmpty() && m_CurTreeParent != NULL)
    {
        m_CurTreeDir = str_TempDir;
        while (m_CurTreeParent != m_MyTree.GetRootItem())//当父节点不为根节点时循环
        {
            //此处就是不断向上层层拼接文件路径的过程,比如123.txt的父节点是test1,然后经过             //一步循环后m_CurTreeDir就为:test1\\123.txt
            str_TempDir = m_MyTree.GetItemText(m_CurTreeParent);
            m_CurTreeDir = str_TempDir + L"\\" + m_CurTreeDir;
            tree_CurTreeTemp = m_CurTreeParent;
            m_CurTreeParent = m_MyTree.GetParentItem(tree_CurTreeTemp);
         }
         m_CurTreeDir = L"E:\\test\\" + m_CurTreeDir;
         CFileFind FileFind;
         BOOL res = FileFind.FindFile(m_CurTreeDir);
         if (res == true)
         {
             if (res = FileFind.FindNextFileW());
             {
                 if (FileFind.IsDirectory() && !FileFind.IsDots())//如果是文件夹
                     return Return_IsFolder;
                 else if (!FileFind.IsDirectory() && !FileFind.IsDots())//如果是文件
                     return Return_IsFile;
              }
          }
    }
    return Error_FileOrFolderNotFound;
}

其中显示未声明的变量,请在CMyTreeDlg类中自行声明,如下:
HTREEITEM m_CurTree;//用以记录当前的节点
HTREEITEM m_CurTreeParent;//用以当前节点的父节点
CString m_CurTreeDir;//用以记录当前节点的路径

3、将找到的文件打开
有了上面两步的准备,我们通过双击打开文件的只得就很简单明了了,我们有对话框上点击树型控件,然后添加双击的事件响应函数,如图2-1
图2-1 为树型控件添加事件响应函数
MFC树型控件浏览文件目录(二)--双击打开文件

然后在其中添加如下加粗代码:其中ShellExecute就是执行外部程序的一个函数。
void CMyTreeDlg::OnNMDblclkMytree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO:   在此添加控件通知处理程序代码
DWORD res = GetFilePathByTreeItem();

//如果当前选择节点为文件,则将其打开
if (res == Return_IsFile)
{
ShellExecute(NULL, NULL, m_CurTreeDir, NULL, NULL, SW_SHOWNORMAL);
}
*pResult = 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值