home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 June / PCWorld_2003-06_cd.bin / KOMUNIK / MIRRORIT / SRC / CHECKTREECTRL.CPP next >
C/C++ Source or Header  |  1998-01-06  |  2KB  |  126 lines

  1. // CheckTreeCtrl.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "MirrorIt.h"
  6. #include "CheckTreeCtrl.h"
  7.  
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CCheckTreeCtrl
  16.  
  17. CCheckTreeCtrl::CCheckTreeCtrl()
  18. {
  19. }
  20.  
  21. CCheckTreeCtrl::~CCheckTreeCtrl()
  22. {
  23. }
  24.  
  25.  
  26. BEGIN_MESSAGE_MAP(CCheckTreeCtrl, CTreeCtrl)
  27.     //{{AFX_MSG_MAP(CCheckTreeCtrl)
  28.     ON_WM_LBUTTONDOWN()
  29.     ON_WM_LBUTTONDBLCLK()
  30.     //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32.  
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CCheckTreeCtrl message handlers
  35.  
  36. void CCheckTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  37. {
  38.     UINT flags = 0;
  39.  
  40.     HTREEITEM nHitItem = HitTest(point, &flags);
  41.     
  42.     if (flags & TVHT_ONITEMICON)
  43.         CheckItem(nHitItem);
  44.     
  45.     CTreeCtrl::OnLButtonDown(nFlags, point);
  46. }
  47.  
  48. void CCheckTreeCtrl::CheckItem(HTREEITEM i)
  49. {
  50.     int n, s;
  51.     
  52.     GetItemImage(i, n, s);
  53.     if (n >= 1) 
  54.         n = 0;
  55.     else
  56.         n = 1;
  57.     SetItemImage(i, n, n);
  58.     CheckParent(i, n);
  59. }
  60.  
  61. void CCheckTreeCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
  62. {
  63.     UINT flags = 0;
  64.  
  65.     HTREEITEM nHitItem = HitTest(point, &flags);
  66.     
  67.     if (flags & TVHT_ONITEMICON)
  68.         CheckItem(nHitItem);
  69.  
  70.     CTreeCtrl::OnLButtonDblClk(nFlags, point);
  71. }
  72.  
  73. void CCheckTreeCtrl::CheckParent(HTREEITEM i, int d)
  74. {
  75.     HTREEITEM j;
  76.     j = GetChildItem(i);
  77.     while (j != NULL)
  78.     {
  79.         UnCheckTree(j, d);
  80.         j = GetNextSiblingItem(j);
  81.     }
  82.  
  83.     int a = 0, b = 0;
  84.     if ((j = GetParentItem(i)) == NULL) return;
  85.     if ((i = GetChildItem(j)) == NULL) return;
  86.     while (i != NULL)
  87.     {
  88.         a++;
  89.         int n, s;
  90.         GetItemImage(i, n, s);
  91.         if (n == 1) b++;
  92.         i = GetNextSiblingItem(i);
  93.     }
  94.     if (b == 0)
  95.     {
  96.         SetItemImage(j, 0, 0);
  97.     }
  98.     else
  99.     if (a > b)
  100.     {
  101.         SetItemImage(j, 2, 2);
  102.     }
  103.     else
  104.     {
  105.         SetItemImage(j, 1, 1);
  106.     }
  107. }
  108.  
  109. void CCheckTreeCtrl::UnCheckTree(HTREEITEM i, int d)
  110. {
  111.     if (i != TVI_ROOT) 
  112.     {
  113.         SetItemImage(i, d, d);
  114.         i = GetChildItem(i);
  115.     }
  116.     else
  117.     {
  118.         i = GetNextItem(NULL, TVGN_CHILD);
  119.     }
  120.     while (i != NULL)
  121.     {
  122.         UnCheckTree(i, d);
  123.         i = GetNextSiblingItem(i);
  124.     }
  125. }
  126.