VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 3186|回复: 19

《实用VC编程之玩转控件》第15课:Tree树形控件

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-11-17 00:35:58 | 显示全部楼层 |阅读模式
1、控件简介:
Tree树形控件也是我们编程过程中比较常用的一个控件,而且在其他软件中也经常能看到,比如Windows系统中的资源管理器:
《实用VC编程之玩转控件》第15课:Tree树形控件

所以,接下来我就教大家如何来使用这个控件!

2、控件的使用:
a、拖拽Tree树形控件到对话框模版上;
b、一些常用的属性:
Check Boxes:结点前是否带有复选框;
Edit Labels:结点名字是否可编辑;
Has Buttons:父节点是否有+号可供展开;
Has Lines:父子结点之间是否有连接线;
Lines At Root:是否从根节点开始就带有虚线;
等等吧,大家可以根据自己的需要设置相关的属性。

c、为Tree树形控件绑定一个 CTreeCtrl 控件类型变量m_Tree;

3、控件的操作:
在树形控件中每一个结点都有一个句柄(HTREEITEM),同时插入结点时必须提供父结点句柄,(其中根Root结点只有一个,既不可以添加也不可以删除)利用
HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );
可以插入一个结点,pszItem为显示的字符,hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。

a、添加结点(有多种重载方式,先介绍第一种):
  1.     HTREEITEM hRoot = m_Tree.InsertItem(_T("父1"));
  2.     HTREEITEM hSub1 = m_Tree.InsertItem(_T("子1"), hRoot);
  3.     HTREEITEM hSub2 = m_Tree.InsertItem(_T("子2"), hRoot);

  4.     HTREEITEM hSub3 = m_Tree.InsertItem(_T("子子1"), hSub2);
复制代码

《实用VC编程之玩转控件》第15课:Tree树形控件

就这样,可以一层一层的向树形控件中插入节点。

b、获得节点的文本:m_Tree.GetItemText(hSub3);
c、设置节点的文本:m_Tree.SetItemText(hSub3, _T("abc"));

d、获得当前选中的节点:HTREEITEM hSelItem = m_Tree.GetSelectedItem();
e、设置当前选中的节点:m_Tree.SelectItem(hTreeItem);
f、默认上面的情况都是针对单选,那么Tree树形控件支不支持多选呢?答案是:默认不支持
不过可以通过给节点前面加上 CheckBox 复选框来解决!下个知识点举例讲解!
备注:那么不通过CheckBox 能不能实现多选呢?答案也是可以的,不过要写很多自定义代码,大家感兴趣的话可以看看这几篇文章,课堂上咱们就不讲解了:
http://www.codeguru.com/cpp/cont ... d/article.php/c629/
http://www.codeguru.com/cpp/cont ... d/article.php/c723/
http://www.codeguru.com/cpp/cont ... /article.php/c9219/

g、遍历子节点:
需要用到的相关函数:
  1. HTREEITEM GetRootItem( ); //得到根结点。
  2. HTREEITEM GetChildItem(HTREEITEM hItem); //得到子结点。
  3. HTREEITEM GetPrevSiblingItem/GetNextSiblingItem(HTREEITEM hItem); //得到指明结点的上/下一个兄弟结点。
  4. HTREEITEM GetParentItem(HTREEITEM hItem); //得到父结点。
复制代码

《实用VC编程之玩转控件》第15课:Tree树形控件

从根节点开始遍历所有节点,判断 CheckBox 是否勾选:

  1. void CMFCTestDlg::EnumTreeItem(HTREEITEM hItem)
  2. {
  3.     if (!hItem) return;

  4.     //先检测自己是否被勾选
  5.     if (m_Tree.GetCheck(hItem))
  6.     {
  7.         CString strText = m_Tree.GetItemText(hItem);
  8.         MessageBox(strText + _T("##勾选了!"));
  9.     }

  10.     //再遍历所有的子节点
  11.     if (m_Tree.ItemHasChildren(hItem))
  12.     {
  13.         HTREEITEM hChildItem = m_Tree.GetChildItem(hItem);
  14.         while (hChildItem)
  15.         {
  16.             EnumTreeItem(hChildItem);
  17.             HTREEITEM hNextItem = m_Tree.GetNextItem(hChildItem, TVGN_NEXT);
  18.             hChildItem = hNextItem;
  19.         }
  20.     }
  21. }

  22. void CMFCTestDlg::OnBnClickedBtnTree()
  23. {
  24.     HTREEITEM hRootItem = m_Tree.GetRootItem(); //从根节点开始遍历
  25.     EnumTreeItem(hRootItem);
  26. }
复制代码


h、删除节点、删除所有节点:
  1. m_Tree.DeleteItem(hSub2); //删除节点
  2. m_Tree.DeleteAllItems();    //删除所有节点
复制代码


i:展开/收起所有节点:
  1. void CMFCTestDlg::ExpandTree(HTREEITEM hItem, UINT nCode)
  2. {
  3.     if (!hItem) return;

  4.     m_Tree.Expand(hItem, nCode);
  5.     if (m_Tree.ItemHasChildren(hItem))
  6.     {
  7.         HTREEITEM hChildItem = m_Tree.GetChildItem(hItem);
  8.         while (hChildItem)
  9.         {
  10.             ExpandTree(hChildItem, nCode);
  11.             HTREEITEM hNextItem = m_Tree.GetNextItem(hChildItem, TVGN_NEXT);
  12.             hChildItem = hNextItem;
  13.         }
  14.     }
  15. }
复制代码

  1. void CMFCTestDlg::OnBnClickedBtnTree()
  2. {
  3.     HTREEITEM hRootItem = m_Tree.GetRootItem(); //从根节点开始遍历
  4.     static UINT nCode = TVE_EXPAND;
  5.     ExpandTree(hRootItem, nCode);
  6.     nCode = (nCode == TVE_EXPAND) ? TVE_COLLAPSE : TVE_EXPAND;
  7. }
复制代码



j:编辑节点文本:
①、控件的 Edit Labels 属性设置为 True;
②、响应控件的 TVN_BEGINLABELEDIT 事件:
  1. void CMFCTestDlg::OnTvnBeginlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.     LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
  4.    
  5.     CEdit *pEdit = m_Tree.GetEditControl();
  6.     if (pEdit) pEdit->LimitText(5);//设置编辑框文本长度为5个字符串

  7.     *pResult = 0; //继续
  8.     //*pResult = 1; //取消,不继续编辑,也不触发 TVN_ENDLABELEDIT
  9. }
复制代码


③、响应控件的 TVN_ENDLABELEDIT 事件:
  1. void CMFCTestDlg::OnTvnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.     LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
  4.     if (pTVDispInfo && pTVDispInfo->item.pszText && _tcslen(pTVDispInfo->item.pszText))
  5.     {
  6.         m_Tree.SetItemText(pTVDispInfo->item.hItem, pTVDispInfo->item.pszText);
  7.     }
  8.     *pResult = 0;
  9. }
复制代码


k、插入带图标的节点:
这里面给大家准备几个ico图标,供程序使用:
《实用VC编程之玩转控件》第15课:Tree树形控件 ico.zip (21.58 KB, 下载次数: 6)




上一篇:《实用VC编程之玩转控件》第14课:Tab标签控件
下一篇:《实用VC编程之玩转控件》第16课:ListCtrl高级列表控件

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

78_avatar_middle
在线会员 csa 发表于 2018-11-17 12:43:50 | 显示全部楼层
又更新不错,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
online_vip 海神号 发表于 2018-11-17 13:58:03 | 显示全部楼层
谢谢老大大哦

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

95_avatar_middle
在线会员 zjh2008 发表于 2018-11-17 21:10:56 | 显示全部楼层
老大啥时候把视频录制成mp4格式的就好了

点评

赞同,手机、平板也能看  发表于 2018-11-18 14:37

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 windowswan 发表于 2018-11-18 20:08:08 | 显示全部楼层
又更新了,谢谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

57_avatar_middle
在线会员 丿丶晴天灬 发表于 2018-11-18 20:47:48 | 显示全部楼层
感谢楼主的分享!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
在线会员 tomok 发表于 2018-11-20 10:22:12 | 显示全部楼层
越来越精彩

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

78_avatar_middle
online_vip good20good 发表于 2018-11-21 10:20:33 | 显示全部楼层
感谢Syc大神的分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

16_avatar_middle
在线会员 boxxie 发表于 2018-11-21 13:35:46 | 显示全部楼层
《实用VC编程之玩转控件》第15课:Tree树形控件
多谢楼主分享,学习了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

41_avatar_middle
online_vip liguolong 发表于 2018-11-24 08:32:35 | 显示全部楼层
感谢楼主分享         

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
在线会员 fashion530 发表于 2018-11-24 19:01:06 | 显示全部楼层
《实用VC编程之玩转控件》第15课:Tree树形控件《实用VC编程之玩转控件》第15课:Tree树形控件《实用VC编程之玩转控件》第15课:Tree树形控件

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

62_avatar_middle
online_vip cc_killer 发表于 2018-11-25 19:38:22 | 显示全部楼层
第15课免费试看

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

08_avatar_middle
在线会员 woliveyou 发表于 2018-11-25 21:45:27 | 显示全部楼层
《实用VC编程之玩转控件》第15课:Tree树形控件《实用VC编程之玩转控件》第15课:Tree树形控件《实用VC编程之玩转控件》第15课:Tree树形控件

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

76_avatar_middle
在线会员 zjy2999 发表于 2018-11-26 10:20:46 | 显示全部楼层
学习!!!!!!!!!!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

10_avatar_middle
online_vip08 小菜一碟 发表于 2018-11-27 09:45:57 | 显示全部楼层
感谢老大又更新了,速度下载学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

02_avatar_middle
在线会员 Dvol 发表于 2018-11-30 03:15:27 | 显示全部楼层
老大万岁,万万岁!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

56_avatar_middle
在线会员 coffeemlx 发表于 2018-12-2 09:30:22 | 显示全部楼层
第15课:Tree树形控件

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

13_avatar_middle
online_vip 明天你好123 发表于 2018-12-3 10:31:29 | 显示全部楼层
helloworld

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

83_avatar_middle
online_vip z.mr 发表于 2018-12-3 18:26:35 | 显示全部楼层

继续学习

楼主辛苦

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-14 00:57

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表