博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CTreeCtrl 控件实现多选并取得选中项
阅读量:6296 次
发布时间:2019-06-22

本文共 2592 字,大约阅读时间需要 8 分钟。

刚开始以为实现起来很难,所以就在网上寻找实现的扩展控件,到最后才发现只要把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         else25         {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         else55         {56             m_listClients.InsertString(m_listClients.GetCount(), m_treeTest.GetItemText(hChild));57         }58         hChild = m_treeTest.GetNextSiblingItem(hChild);59     }60 }

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

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

这个功能在我的中实现。

转载地址:http://bglta.baihongyu.com/

你可能感兴趣的文章
mysql超大数据库备份
查看>>
我的友情链接
查看>>
Citrix Reciever更改https为http模式
查看>>
linux下忘记mysql root密码
查看>>
nessus国内用户不让免费使用了!
查看>>
配置vsftpd的遇到的坑及搭建虚拟账户
查看>>
关于P2P流量的识别方式
查看>>
Open×××的Linux内核版,鬼魅的残缺 part I:The PROTOCOL
查看>>
UVA 610 Street Directions 双连通分量
查看>>
[PXE] Linux(centos6)中PXE 服务器搭建,PXE安装、启动及PXE理论详解
查看>>
cnetos7安装docker V1.0
查看>>
Bash中的$*和$@的区别
查看>>
MySQL常见错误代码及代码说明
查看>>
Android App定位和规避内存泄露方法研究
查看>>
移动平台还有哪些创业机会
查看>>
ansible之fetch模块
查看>>
ftp虚拟账户配置
查看>>
sql server 2008数据复制
查看>>
EIGRP的AD(管理距离)、AD(宣告距离)、FD(可行距离)
查看>>
准爸爸日记——20120502海淀妇幼建档续
查看>>