如何实现三态选择树——重点是树的遍历

来源:互联网 发布:javaweb数据字典使用 编辑:程序博客网 时间:2024/05/21 10:48
有时候我们经常需要实现树的多态选择,本文就介绍一种三态选择树的具体实现。 
步骤一:生成一个对话框工程。 
步骤二:添加树控件,设置所需的属性。 
步骤三:做三态选择框图标,且在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);}}}