如何实现三态选择树

无名小卒的杯具

无名小卒的杯具

2016-01-29 12:05

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

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

(本文来源于图老师网站,更多请访问http://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 三态

霍夫曼树编码的实现

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

lol偷钱流符文搭配推荐

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

JSP 动态树的实现

Web开发
JSP 动态树的实现

Ajax实现无刷新树

Web开发
Ajax实现无刷新树

lolAD刺客新符文搭配推荐

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

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

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

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

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