016文件树的完善(双击事件和文件信息的获取)

本文介绍了如何在CRemoteClientDlg中操作文件目录,包括使用trellcontrol和listcontroll控件、LoadFileInfo函数加载文件信息、删除子节点等,以及相关事件的处理方法。
摘要由CSDN通过智能技术生成

1 界面布局

trell control 控件

属性:始终显示所选内容、每个子节点的线条(具有行),具有按钮(有子节点显示一个按钮)、开启跟踪选择、禁用拖拽、

允许单个展开、关闭工具提示

给控件添加双击事件、单击事件

list controll 控件,添加变量

属性:始终显示所选内容、视图改为list

2 完成功能:

1 目录和文件功能代码

void CRemoteClientDlg::LoadFileInfo()
{
    // 1 获取选中的item路径
    CPoint ptMouse;
    // 获取当前坐标的全局坐标
    GetCursorPos(&ptMouse);
    // 全局坐标转为m_tree 上的坐标
    m_tree.ScreenToClient(&ptMouse);
    // HitTest返回占用指定点的树视图项的句柄,如果没有项占用该点,则返回 NULL。
    HTREEITEM hTreeSelected = m_tree.HitTest(ptMouse, 0);
    if (hTreeSelected == NULL)
    {
        return;
    }
    // 判断选中的是否是目录,在插入目录是默认插入了一个空目录
    if (m_tree.GetChildItem(hTreeSelected) == NULL)
    {
        return;
    }
    // 清空选中目录的子节点
    DeleteTreeChildrenItem(hTreeSelected);
    // 清空列表文件
    m_list.DeleteAllItems();
    CString strPath = GetItemPath(hTreeSelected);
    // 发送命令
    int nCmd = SendCommandPacket(2, false, (BYTE*)strPath.GetBuffer(), strPath.GetLength());
    // 接收处理数据
    CClientSocket* pclient = CClientSocket::getInstance();
    // 拿到缓冲区数据转为FILEINFO结构
    PFILEINFO pInfo = (PFILEINFO)pclient->GetPacket().strData.c_str();
    // 目录下有文件HasNext就为true(服务端逻辑)
    while (pInfo->HasNext) {
        if (pInfo->isDirectory)
        {
            // 过滤.和.. 文件夹
            if (CString(pInfo->szName) == "." || CString(pInfo->szName) == "..")
            {
                nCmd = pclient->DealCommand();
                if (nCmd < 0)
                    break;
                pInfo = (PFILEINFO)pclient->GetPacket().strData.c_str();
                continue;
            }
            // 插入数据
            HTREEITEM hTemp = m_tree.InsertItem(pInfo->szName, hTreeSelected, TVI_LAST);
            m_tree.InsertItem("", hTemp, TVI_LAST);
        }
        else {
            m_list.InsertItem(0, pInfo->szName);
        }
​
        nCmd = pclient->DealCommand();
        if (nCmd < 0)
            break;
        pInfo = (PFILEINFO)pclient->GetPacket().strData.c_str();
    }
    pclient->CloseSocket();
}

2 获取一个子节点的目录

// 不停获取某一节点父节点,然后取父节点的text相加,就获得了路径
CString CRemoteClientDlg::GetItemPath(HTREEITEM hTree)
{
    CString strTmp, strText;
    do {
        // 返回 hItem 指定的项的文本。
        strTmp = m_tree.GetItemText(hTree);
        strText = strTmp + "\\" + strText;
        // GetParentItem 调用此函数可检索 hTree 的父级。
        hTree = m_tree.GetParentItem(hTree);
    } while (hTree != NULL);
    return strText;
}

3 删除一个子节点下的节点

// 不停获取某一节点子节点,然后删除
void CRemoteClientDlg::DeleteTreeChildrenItem(HTREEITEM hTree)
{
    HTREEITEM hSub = NULL;
    do{
        // GetChildItem 获取 hTree的子节点
        hSub = m_tree.GetChildItem(hTree);
        if (hSub != NULL)
        {
            m_tree.DeleteItem(hSub);
        }
    } while (hSub != NULL);
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值