Treecontrol 选中父节点后让子节点全部选中

方法一:
void CTreeTest_demoDlg::ChangeTreeItemAll(CTreeCtrl &tree, HTREEITEM hItem,BOOL bSelect) 
HTREEITEM x = tree.GetChildItem(hItem); 
if(NULL == x) return; 
do
tree.SetCheck( x, bSelect ); 
ChangeTreeItemAll(tree,x,bSelect);
}
while( ( x = tree.GetNextSiblingItem( x ) )!= NULL ); 
}

 void CTreeTest_demoDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
 {
  // TODO: 在此添加控件通知处理程序代码
 
  CPoint point; 
  UINT pflags; 
  GetCursorPos(&point); 
  m_ctrTree.ScreenToClient(&point); 
  HTREEITEM hitItem = m_ctrTree.HitTest( point, &pflags );
  if ( pflags & (TVHT_ONITEMSTATEICON )) 
 
 
  //if(m_bSelectDirect) // 选中父结点时他的直接孩子(儿子)结点同时被选中 
  //{ 
  // if ( m_ctrTree.GetCheck( hitItem ) )
  //
  // ChangeTreeItemDirect(m_ctrTree,hitItem,FALSE); 
  // }
  // else 
  //
  // ChangeTreeItemDirect(m_ctrTree,hitItem,TRUE); 
  // }
  //} 
//    if(m_bSelectAll) // 选中父结点时他的孩子结点以及所有后代(孙子)的节点被选中 
   
    if ( m_ctrTree.GetCheck( hitItem ) ) 
   
    ChangeTreeItemAll(m_ctrTree,hitItem,FALSE); 
   
    else 
    {
    ChangeTreeItemAll(m_ctrTree,hitItem,TRUE); 
   
    }
 
  *pResult = 0;
 }


方法二:
void CTreeTest_demoDlg::UpdateTreeCheck(const HTREEITEM hParent, const BOOL flag) 
if (m_ctrTree.ItemHasChildren(hParent)) 
HTREEITEM hNextItem; 
HTREEITEM hChildItem = m_ctrTree.GetChildItem(hParent); 
while (hChildItem != NULL) 
//递归获取当前节点下的子节点 
m_ctrTree.SetCheck(hChildItem,flag); 
UpdateTreeCheck(hChildItem,flag); 
hNextItem = m_ctrTree.GetNextItem(hChildItem, TVGN_NEXT);
hChildItem = hNextItem;
void CTreeTest_demoDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
DWORD dw = GetMessagePos();
CPoint pt(LOWORD(dw),HIWORD(dw)); //鼠标的屏幕坐标
CPoint ptClient; 
CRect rcPart;
m_ctrTree.GetWindowRect(rcPart);
ptClient.x = pt.x - rcPart.left;
ptClient.y = pt.y - rcPart.top; 
UINT uFlags;
HTREEITEM hItem = m_ctrTree.HitTest(ptClient, &uFlags); 
if ((hItem != NULL) && (uFlags & TVHT_ONITEMSTATEICON)) 
if (m_ctrTree.ItemHasChildren(hItem)) 
BOOL flag = m_ctrTree.GetCheck(hItem); //这时父节点还没有更新,需要取反 
UpdateTreeCheck(hItem,!flag); 
}
m_ctrTree.Select(hItem, TVGN_CARET);
*pResult = 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值