如何实现三态选择树

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

有时候我们经常需要实现树的多态选择,本文就介绍一种三态选择树的具体实现。

步骤一:生成一个对话框工程。

步骤二:添加树控件,设置所需的属性。

步骤三:做三态选择框图标,且在OnInitDialog()中初始化树,使树控件与选择框图标所构成的图像列表控件联系,具体实现看源代码。

步骤四:实现树的左击消息,实现三态选择。

01. void CMutiTreeDemoDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult)
02. {
03. UINT uFlags=0;
04. HTREEITEM hPItem;
05. CPoint point = GetCurrentMessage()->pt;
06. ScreenToClient(&point);
07. point.Offset(-8,-16);
08. HTREEITEM hItem =m_TripleTree.HitTest(point, &uFlags);
09. if ( (uFlags&TVHT_ONITEM) )
10. {
11. hPItem=m_TripleTree.GetParentItem(hItem);
12. int m,n,m1,n1;
13. m_TripleTree.GetItemImage(hItem,m,n);
14. if(m!=1)
15. {
16. m_TripleTree.SetItemImage(hItem,1,1);
17. m_TripleTree.GetItemImage(hItem,m1,n1);
18. TravelChild(hItem, m1);
19. if(hPItem!=NULL)
20. TravelSiblingAndParent(hItem,m1);
21. }
22. else if(m==1)
23. {
24. m_TripleTree.SetItemImage(hItem,0,0);
25. m_TripleTree.GetItemImage(hItem,m1,n1);
26. TravelChild(hItem, m1);
27. if(hPItem!=NULL)
28. TravelSiblingAndParent(hItem,m1);
29. }
30. //  MessageBox("xxxx");
31. }
32. *pResult = 0;  
33. }

这其中,最难实现的是树的遍历,我用递归

      TravelChild(HTREEITEM hItem, int m1);

      TravelSiblingAndParent(HTREEITEM hItem,int m1); 来实现。

代码如下:

01. //递归
02. void CMutiTreeDemoDlg::TravelChild(HTREEITEM hItem,int m)
03. {
04. HTREEITEM hChildItem,hBrotherItem;
05. hChildItem=m_TripleTree.GetChildItem(hItem);
06. m_TripleTree.SetItemImage(hChildItem,m,m);
07. if(hChildItem!=NULL)
08. TravelChild(hChildItem, m);
09. hBrotherItem=m_TripleTree.GetNextSiblingItem(hChildItem);
10. m_TripleTree.SetItemImage(hBrotherItem,m,m);
11. if(hBrotherItem!=NULL)
12. TravelChild(hBrotherItem, m);
13. }
14.  
15. void CMutiTreeDemoDlg::TravelSiblingAndParent(HTREEITEM hItem, int m)
16. {
17. int m1,n1;
18. HTREEITEM hNextSiblingItem,hPrevSiblingItem,hParentItem;
19. m1=m;
20. hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hItem);
21. while(hNextSiblingItem!=NULL)
22. {
23. m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1);
24. if(m1!=m)
25. break;
26. else
27. {
28. hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hNextSiblingItem);
29. if(hNextSiblingItem!=NULL)
30. m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1);
31. }
32. }
33.  
34. hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hItem);
35. while(hPrevSiblingItem!=NULL)
36. {
37. m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1);
38. if(m1!=m)
39. break;
40. else
41. {
42. hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hPrevSiblingItem);
43. if(hPrevSiblingItem!=NULL)
44. m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1);
45. }
46. }
47. if(m1==m)
48. {
49. hParentItem=m_TripleTree.GetParentItem(hItem);
50. if(hParentItem!=NULL)
51. {
52. m_TripleTree.SetItemImage(hParentItem,m1,m1);
53. TravelSiblingAndParent(hParentItem,m1);
54. }
55. }  
56.  
57. if(m1!=m)
58. {
59.  
60. hParentItem=m_TripleTree.GetParentItem(hItem);
61. while(hParentItem!=NULL)
62. {
63. m_TripleTree.SetItemImage(hParentItem,2,2);
64. hParentItem=m_TripleTree.GetParentItem(hParentItem);
65. }
66. }
67.  
68. }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值