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); }