如何实现三态选择树

无名小卒的杯具

无名小卒的杯具

2016-01-29 12:05

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

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

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

下载本文示例工程

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


有时候我们经常需要实现树的多态选择,本文就介绍一种三态选择树的具体实现。
步骤一:生成一个对话框工程。
步骤二:添加树控件,设置所需的属性。
步骤三:做三态选择框图标,且在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);}}}
具体细节请阅读本文提供的源代码。
展开更多 50%)
分享

猜你喜欢

如何实现三态选择树

C语言教程 C语言函数
如何实现三态选择树

三态选择树实现终结者

C语言教程 C语言函数
三态选择树实现终结者

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

(仅IE下有效)关于checkbox 三态

Web开发
(仅IE下有效)关于checkbox 三态

C++实现正态随机分布的方法

编程语言 网络编程
C++实现正态随机分布的方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

霍夫曼树编码的实现

编程语言 网络编程
霍夫曼树编码的实现

JSP 动态树的实现

Web开发
JSP 动态树的实现

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

PSV《讨鬼传 极》献双刀千切流配魂推荐

PSV《讨鬼传 极》献双刀千切流配魂推荐

用VB6.0设计一个打字练习软件

用VB6.0设计一个打字练习软件
下拉加载更多内容 ↓