如何实现三态选择树

2016-01-29 12:05 49 1 收藏

如何实现三态选择树,如何实现三态选择树

【 tulaoshi.com - C语言心得技巧 】

如何实现三态选择树
作者:河南科技大学 丛雷

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载本文示例工程

示例代码运行效果图如下:


有时候我们经常需要实现树的多态选择,本文就介绍一种三态选择树的具体实现。
步骤一:生成一个对话框工程。
步骤二:添加树控件,设置所需的属性。
步骤三:做三态选择框图标,且在OnInitDialog()中初始化树,使树控件与选择框图标所构成的图像列表控件联系,具体实现看源代码。
步骤四:实现树的左击消息,实现三态选择。

void CMutiTreeDemoDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) {UINT uFlags=0;HTREEITEM hPItem;CPoint point = GetCurrentMessage()->pt;ScreenToClient(&point);point.Offset(-8,-16);HTREEITEM hItem =m_TripleTree.HitTest(point, &uFlags);if ( (uFlags&TVHT_ONITEM) ){hPItem=m_TripleTree.GetParentItem(hItem);int m,n,m1,n1;m_TripleTree.GetItemImage(hItem,m,n);if(m!=1){m_TripleTree.SetItemImage(hItem,1,1);m_TripleTree.GetItemImage(hItem,m1,n1);TravelChild(hItem, m1);if(hPItem!=NULL)TravelSiblingAndParent(hItem,m1);}else if(m==1){m_TripleTree.SetItemImage(hItem,0,0);m_TripleTree.GetItemImage(hItem,m1,n1);TravelChild(hItem, m1);if(hPItem!=NULL)TravelSiblingAndParent(hItem,m1);}//MessageBox("xxxx");}*pResult = 0;}
这其中,最难实现的是树的遍历,我用递归
TravelChild(HTREEITEM hItem, int m1);
TravelSiblingAndParent(HTREEITEM hItem,int m1); 来实现。

代码如下:
//递归void CMutiTreeDemoDlg::TravelChild(HTREEITEM hItem,int m){HTREEITEM hChildItem,hBrotherItem;hChildItem=m_TripleTree.GetChildItem(hItem);m_TripleTree.SetItemImage(hChildItem,m,m);if(hChildItem!=NULL)TravelChild(hChildItem, m);hBrotherItem=m_TripleTree.GetNextSiblingItem(hChildItem);m_TripleTree.SetItemImage(hBrotherItem,m,m);if(hBrotherItem!=NULL)TravelChild(hBrotherItem, m);}void CMutiTreeDemoDlg::TravelSiblingAndParent(HTREEITEM hItem, int m){int m1,n1;HTREEITEM hNextSiblingItem,hPrevSiblingItem,hParentItem;m1=m;hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hItem);while(hNextSiblingItem!=NULL){m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1);if(m1!=m)break;else{hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hNextSiblingItem);if(hNextSiblingItem!=NULL)m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1);}}hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hItem);while(hPrevSiblingItem!=NULL){m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1);if(m1!=m)break;else{hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hPrevSiblingItem);if(hPrevSiblingItem!=NULL)m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1);}}if(m1==m){hParentItem=m_TripleTree.GetParentItem(hItem);if(hParentItem!=NULL){m_TripleTree.SetItemImage(hParentItem,m1,m1);TravelSiblingAndParent(hParentItem,m1);}}if(m1!=m){hParentItem=m_TripleTree.GetParentItem(hItem);while(hParentItem!=NULL){m_TripleTree.SetItemImage(hParentItem,2,2);hParentItem=m_TripleTree.GetParentItem(hParentItem);}}}
具体细节请阅读本文提供的源代码。

来源:http://www.tulaoshi.com/n/20160129/1484532.html

延伸阅读
老人如何保持年轻态的心理 老人在身体衰老的同时要预防心理的衰老。老人要保持良好的乐观心态,让自己的心理保持年轻,才能让自己的生活更加的舒心。那么,老人要如何保持心理年轻呢? 1、巩固爱情 俗话说“少年夫妻老来伴,恩爱夫妻多长寿”。愈是年老愈要珍惜、巩固爱情。老年夫妇切莫分开各自跟随儿女过日...
标签: Web开发
html head meta http-equiv="Content-Type" content="text/html; charset=gb2312" title及联选择-用于权限选择比较合适/title /head body ul id="tree"     liinput type=checkbox         ul             liinput type=checkbox...
树型控件用来显示具有一定层次结构的数据项时方便、直观,被广泛地应用在各种软件中,如资源管理器中的磁盘目录就用的是树型 控件,我们在编程中也会经常用到,但 MFC 中提供的 CTreeCtrl 类并不直接支持拖动节点等高级特性,这使我们程序员编程时有很大限制,又给软件用户带来了一些不便。下面就让我们自己动手来解决这个问题,实现...
标签: ASP
数据库结构(共使用了两个表) 1.tblCategory 字段名 类型 Root binary 说明树关或开(目录的根) ID 自动编号 关键字 Sort integer 识别该字段内容的整数(如果root是开状态sort为0)表示显示的目录的顺序 Name text(255)可以包含html中的标识符 HREF text(255) 允许空 2.tblPages ID 自动编号 Sort integer 关键字 Name text...
标签: ASP
  bigeagle】 于 2000-12-6 14:43:38 加贴在 Joy ASP ↑: 下面这种方法是大怪兽和怡红公子现在采用的方法 create table forum ( ID int NOT NULL IDENTITY,/*帖子序列号*/ rootID int NOT NULL, /*根帖子序列号*/ parentID int NOT NULL default=0,/*双亲帖子序列号*/ indent tinyint,/*缩进*/ order tinyint,/*同主题帖子排序*/ user...

经验教程

325

收藏

19
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部