void CTreeViewEx::vSetCheckChildren(HTREEITEM hItem, BOOL fCheck) { if(hItem == NULL) { return; } CTreeCtrl &omTreeCtrl = GetTreeCtrl(); HTREEITEM hNext = omTreeCtrl.GetChildItem(hItem); vSetCheck(hItem, fCheck); // loop to set item state for children if ( omTreeCtrl.ItemHasChildren(hItem)) { HTREEITEM htiChild = omTreeCtrl.GetChildItem (hItem); if (htiChild == NULL) { return; } else { vSetCheckChildren(htiChild, fCheck); } HTREEITEM htiSibling = omTreeCtrl.GetNextSiblingItem (htiChild); while (htiSibling ) { vSetCheckChildren(htiSibling, fCheck); htiSibling = omTreeCtrl.GetNextSiblingItem(htiSibling); } } return; }
void CCheckBoxTree::vSetCheckParent(HTREEITEM hItem) { if(hItem == nullptr) { return; } HTREEITEM hParentItem = GetParentItem(hItem); HTREEITEM hChildItem; BOOL bAllChecked = TRUE; if( ItemHasChildren(hParentItem)) { hChildItem = GetChildItem(hParentItem); while(hChildItem) { if(!bIsItemChecked(hChildItem)) { bAllChecked = FALSE; break; } hChildItem = GetNextSiblingItem(hChildItem); } } BOOL fCheck=0; vSetCheck(hParentItem, bAllChecked); vSetCheckParent(hParentItem); vSetCheckChildren(hParentItem,!fCheck); }
/****************************************************************************** Function Name : OnLButtonDown Input(s) : UINT unFlag - Flags CPoint point - Mouse Pointer point Output : void Functionality : ON_WM_LBUTTON Handler used to toggle the check point Member of : CTreeViewEx Friend of : - Author(s) : Venkatanarayana Makam Date Created : 30/03/2011 Modifications : ******************************************************************************/ void CTreeViewEx::OnLButtonDown(UINT unFlag, CPoint point) { UINT unHitTestFlags = 0; HTREEITEM hItem = GetTreeCtrl().HitTest(point, &unHitTestFlags); if((hItem != NULL) && (TVHT_ONITEMSTATEICON & unHitTestFlags)) { BOOL bCheck = bIsItemChecked(hItem); vSetCheck(hItem, !bCheck); vSetCheckChildren(hItem, !bCheck); vSetCheckParent(hItem); return; } CTreeView::OnLButtonDown(unFlag, point); }
void CCheckBoxTree::vSetCheckChildren(HTREEITEM hItem, BOOL fCheck) { if(hItem == nullptr) { return; } vSetCheck(hItem, fCheck); // loop to set item state for children if ( ItemHasChildren(hItem)) { HTREEITEM htiChild = GetChildItem (hItem); while (htiChild != nullptr) { vSetCheck(htiChild, fCheck); vSetCheckChildren(htiChild, fCheck); htiChild = GetNextSiblingItem(htiChild); } } }
void CCheckBoxTree::OnLButtonDown(UINT nFlags, CPoint point) { UINT nHitTestFlags = 0; HTREEITEM hItem = HitTest(point, &nHitTestFlags); //MessageBox( "BEFORE IF", "IF1", MB_OK); if((hItem != nullptr) && (TVHT_ONITEMSTATEICON & nHitTestFlags)) { //MessageBox( "INSIDE IF", "IF1", MB_OK); //BOOL bCheck= GetCheck(hItem); BOOL bCheck = bIsItemChecked(hItem); //vSetCheck(hItem,!bCheck); vSetCheckChildren(hItem,!bCheck); if(!bCheck) { HTREEITEM root,parent; root=GetRootItem(); SetCheck(root); parent=GetParentItem(hItem); SetCheck(parent); } if(bCheck) { HTREEITEM root; HTREEITEM child; root=GetRootItem(); SetCheck(root,0); while(ItemHasChildren(root)) { //MessageBox("wHILE1", "WHILE1", MB_OK); HTREEITEM parent=GetChildItem(root); while(ItemHasChildren(parent)) { if(GetCheck(parent)) { SetCheck(parent,0); child=GetChildItem(parent); //MessageBox( "wHILE2", "WHILE2", MB_OK); while(child) { if(GetCheck(child)) { SetCheck(root); SetCheck(parent); } child=GetNextSiblingItem(child); if ( child == nullptr ) { break; } } } parent=GetNextSiblingItem(parent); if ( parent == nullptr ) { break; } } parent=GetNextSiblingItem(parent); if ( parent == nullptr ) { break; } } } } else { //MessageBox( "INSIDE ELSE", "ELSE", MB_OK); CTreeCtrl::OnLButtonDown(nFlags, point); } }