刚开始以为实现起来很难,所以就在网上寻找实现的扩展控件,到最后才发现只要把CTreeCtrl 控件的Check Boxes 属性设为真就可以了,会在每个树形节点前添加一个CheckBox。

多选已经实现了,下面就是取得选中的项了,在网上搜了以下也没有太好的办法,于是就自己动手写。大概思路是,遍历整个树形控件,访问每个节点并判断该节点是否被选中,使用CTreeCtrl类的成员函数GetCheck()来判断,返回真假。

实例的界面如下:

代码如下:

首先是插入测试节点函数,在OnInitDialog()函数中调用

 1 void CCheckBoxTreeDlg::InsertNode()
 2 {
 3     HTREEITEM hRootItem, hSubItem;
 4     CString strTest("TestNode");
 5     for(int i = 0;i < 10;i++)
 6     {
 7         hSubItem = m_treeTest.InsertItem(strTest + TCHAR(48 + i), 0, 0, TVI_ROOT, TVI_LAST);
 8         m_treeTest.InsertItem(strTest + TCHAR(48 + i) + "child", 0, 0, hSubItem, TVI_LAST);
 9     }
10
11     hRootItem = m_treeTest.GetRootItem();
12     if(NULL != hRootItem)
13     {
14         hSubItem = m_treeTest.GetNextSiblingItem(hRootItem);
15         CString strText = m_treeTest.GetItemText(hSubItem);
16     }
17 }

接着是在增加按钮的点击消息处理函数中获取选中的节点并插入到右边的CListBox控件中

 1 // 双击添加按钮
 2 void CCheckBoxTreeDlg::OnBnClickedBtnAdd()
 3 {
 4     // TODO: 在此添加控件通知处理程序代码
 5     HTREEITEM hRoot = m_treeTest.GetRootItem();
 6
 7     while(NULL != hRoot)
 8     {
 9         CheckAndAddNode(hRoot);
10         hRoot = m_treeTest.GetNextSiblingItem(hRoot);
11     }
12 }
13 // 递归遍历树形控件
14 void CCheckBoxTreeDlg::CheckAndAddNode(HTREEITEM hRoot)
15 {
16     // 如果不是叶子节点
17     if(TRUE == m_treeTest.ItemHasChildren(hRoot))
18     {
19         if(TRUE == m_treeTest.GetCheck(hRoot))
20         {
21             // 插入所有页节点
22             InsertAllLeaves(hRoot);
23         }
24         else
25         {
26             // 查询所有节点,递归
27             HTREEITEM hChild = m_treeTest.GetChildItem(hRoot);
28             while(NULL != hChild)
29             {
30                 CheckAndAddNode(hChild);
31                 hChild = m_treeTest.GetNextSiblingItem(hChild);
32             }
33         }
34     }
35     else // 是叶子节点
36     {
37         // 被选中
38         if(TRUE == m_treeTest.GetCheck(hRoot))
39         {
40             m_listClients.InsertString(m_listClients.GetCount(), m_treeTest.GetItemText(hRoot));
41         }
42     }
43 }
44 // 插入所有页节点
45 void CCheckBoxTreeDlg::InsertAllLeaves(HTREEITEM hRoot)
46 {
47     HTREEITEM hChild = m_treeTest.GetChildItem(hRoot);
48     while(NULL != hChild)
49     {
50         if(TRUE == m_treeTest.ItemHasChildren(hChild))
51         {
52             InsertAllLeaves(hChild);
53         }
54         else
55         {
56             m_listClients.InsertString(m_listClients.GetCount(), m_treeTest.GetItemText(hChild));
57         }
58         hChild = m_treeTest.GetNextSiblingItem(hChild);
59     }
60 }

有一点需要解释的是,考虑到非叶子节点一般都是作为分类来使用的,所以添加的时候只添加叶子节点。

至此这个小程序的功能就完成了,但是有点不完美的是不能实现父节点与子节点的级联选中或者取消选中。

这个功能在我的下篇博客中实现。

转载于:https://www.cnblogs.com/lit10050528/p/3720575.html

CTreeCtrl 控件实现多选并取得选中项相关推荐

  1. 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式

    GridView既强大又好用.为了让它更强大.更好用,我们来写一个继承自GridView的控件. [索引页] [×××] 扩展GridView控件(7) - 行的指定复选框选中时改变行的样式 作者:w ...

  2. 在 GridView 控件中添加一列复选框51

    简介 在前面的教程中 , 我们学习了如何为 GridView 控件添加一列 单选 按钮来选择一个特定的记录.当用户被限制最多只能从网格中选中一项时,一列单选按钮是一个非常恰当的用户界面.然而,有时我们 ...

  3. Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件

    在web开发中,带checkbox的tree是一个很有用的东东,比如权限选择.分类管理,如果不用sl,单纯用js+css实现是很复杂的,有了SL之后,就变得很轻松了 解决方案一: 利用Silvelri ...

  4. 使用easyui框架form控件,单选按钮radio或复选框checkbox样式问题

    为什么80%的码农都做不了架构师?>>>    easyui只提供了textbox文本框,未提供单选按钮radio或复选框checkbox控件,在使用过程中,会存在单选按钮radio ...

  5. DEV控件中GridView中的复选框与CheckBox实现联动的全选功能

    最初的界面图如图1-1(全选框ID: cb_checkall  DEV控件名称:gcCon ): 要实现的功能如下图(1-2  1-3  1-4)及代码所示: 图1-2 图1-3 图1-4 O(∩_∩ ...

  6. 判断鼠标不在控件上_VB常用控件属性讲解单选按钮、复选框总结

    1 单选按钮.复选框做为VB编程中的选择性控件,在实际程序中有着广泛的应用,所以熟练掌握其特殊属性的用法就很重要了! 单选按钮.复选框的实际应用图 复选框(CheckBox)控件 属性 说明 Name ...

  7. JS对象迭代、事件处理器、表单控件绑定、表单复选框、表单单选按钮

    JS对象迭代 知识点 v-for v-for 循环JS对象,把对象内容循环显示到页面上. <div id="myApp"><h1>JS对象迭代</h1 ...

  8. 为tableview添加带控件的单元格如复选框checkbox与combbox单元格

    我们常常会有这样的需求,为QTableView增加复选框checkbox和选择下拉框combbox,毕竟依靠键盘输入不是很好约束其规范性.下面我们逐个来介绍.完成之后的效果如下: 一.准备TableV ...

  9. vb html单选按钮,VB常用控件属性讲解--单选按钮、复选框总结

    属性说明 Name复选框控件的名称 Alignment设置标题文本的对齐方式, 取值为:  0 左对齐  1 右对齐 Appearance是否用立体效果绘制,取值为:  0 平面  1 3D(立体) ...

最新文章

  1. 电压控制型开关电源的基本电路
  2. python手机版怎么用-在手机上也可以优雅地进行python编程,你知道吗?
  3. Hbase 2.x Region in transition (永久RIT) 异常解决
  4. 企业网站 源码 服务邮箱:_后来才知道:温州腾讯企业邮箱定制服务
  5. 用virt-manager管理远程KVM虚拟机
  6. 常用的几个提高iOS开发效率的开源类库及工具
  7. Linux学习笔记---使用tftp命令下载文件
  8. windows环境下安装zookeeper教程详解(单机版)
  9. 由alpha matte生成trimap
  10. Atitit Embed db use嵌入式数据库用途 目录 1.1. 从软件角度来说,数据库分类为两种: 1 2. 运维一体化,提升开发效率 1 2.1. 可以使用sql 这样的dsl 4gl来查
  11. 《Hadoop权威指南》知识点整理5
  12. Selenium调用使用360浏览器,QQ浏览器,遨游浏览器,猎豹浏览器,Chromium
  13. prewitt算子实现
  14. 浙江大学【面板数据分析与STATA应用】——第二讲长面板数据分析与机制识别方法
  15. TestCenter测试管理工具功能详解十五(T)
  16. 本地ASP.NET开发页面使用AzureAD(AAD)验证登录
  17. 从现实世界的角度去理解计算机领域的知识
  18. c语言选择结构作用,c语言选择结构程序设计教案
  19. 文内码转换巨匠增强版 官方版
  20. DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

热门文章

  1. android双击熄屏代码,Android响应双击屏幕事件
  2. 在线shell连接服务器,Xshell如何连接服务器
  3. dede php 循环,织梦怎么循环调用多级子栏目如二级栏目下三级栏目
  4. 关于微分方程的初值条件和边界条件(狄里克雷(Dirichlet)条件、诺依曼(Neumann)条件、洛平(Robin)条件)
  5. 20分钟学会CMake
  6. 区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现
  7. x-manager 管理 kvm虚拟机
  8. MobileNets论文阅读笔记
  9. 西安电子地图下载 来自谷歌电子地图库 地图展示15、17、19级
  10. 纯 CSS 实现高度与宽度成比例的效果