树形控件的部分功能

这段代码展示了如何使用C++在MFC中遍历树形控件(CTreeCtrl)的子节点和兄弟节点,并同步它们的检查状态。函数`TravelChild`用于递归设置子节点及其子节点、兄弟节点的状态,而`TravelSiblingAndParent`则处理同一层级的相邻节点,确保同一父节点下的所有节点状态一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void CSelectReceiverDlg::TravelChild(HTREEITEM hItem, BOOL ItemFlag)
{
 HTREEITEM   hChildItem,hBrotherItem;  
   
 //查找子节点,没有就结束  
 hChildItem = m_tree.GetChildItem(hItem);  
 if(hChildItem!=NULL)  
 {  
  //设置子节点的状态与当前节点的状态一致  
  m_tree.SetCheck(hChildItem,ItemFlag);  
  // CTreeCtrl::SetItemState(   hChildItem,   INDEXTOSTATEIMAGEMASK(nState),   TVIS_STATEIMAGEMASK   );  
  //再递归处理子节点的子节点和兄弟节点  
  TravelChild(hChildItem,   ItemFlag);  
  
  //处理子节点的兄弟节点和其子节点  
  hBrotherItem=m_tree.GetNextSiblingItem(hChildItem);  
  while   (hBrotherItem)  
  {  
   //设置子节点的兄弟节点状态与当前节点的状态一致  
   m_tree.SetCheck(hBrotherItem,ItemFlag);  
   // int   nState1   =   GetItemState(   hBrotherItem,   TVIS_STATEIMAGEMASK   )   >>   12;  
   // if(nState1!=0)  
   // {  
   // CTreeCtrl::SetItemState(   hBrotherItem,   INDEXTOSTATEIMAGEMASK(nState),   TVIS_STATEIMAGEMASK   );  
   // }  
   //再递归处理子节点的兄弟节点的子节点和兄弟节点  
   TravelChild(hBrotherItem,   ItemFlag);  
   hBrotherItem=m_tree.GetNextSiblingItem(hBrotherItem);  
  }  
 }  
}

 

void CSelectReceiverDlg::TravelSiblingAndParent(HTREEITEM hItem, BOOL bItemFlag)
{
 BOOL   Flag1,Flag2;
 HTREEITEM hNextSiblingItem,hPrevSiblingItem,hParentItem;
 
    Flag1=bItemFlag;
 hNextSiblingItem=m_tree.GetNextSiblingItem(hItem);
 while(hNextSiblingItem!=NULL)
 {
  Flag2=m_tree.GetCheck(hNextSiblingItem);
  if(Flag1!=Flag2)
   break;
  else
  {
   hNextSiblingItem=m_tree.GetNextSiblingItem(hNextSiblingItem);
   if(hNextSiblingItem!=NULL)
    Flag2=m_tree.GetCheck(hNextSiblingItem);
  }
 }
 
 hPrevSiblingItem=m_tree.GetPrevSiblingItem(hItem);
 while(hPrevSiblingItem!=NULL)
 {
  Flag2=m_tree.GetCheck(hPrevSiblingItem);
  if(Flag1!=Flag2)
   break;
  else
  {
   hPrevSiblingItem=m_tree.GetPrevSiblingItem(hPrevSiblingItem);
   if(hPrevSiblingItem!=NULL)
    Flag2=m_tree.GetCheck(hPrevSiblingItem);
  }
 }
 if(Flag1==Flag2)
 {
  hParentItem=m_tree.GetParentItem(hItem);
  if(hParentItem!=NULL)
  {
   m_tree.SetCheck(hParentItem,Flag2);
   TravelSiblingAndParent(hParentItem,Flag2);
  }
 } 
 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值