VC如何实现treectrl父子节点联动

voidsky 2009-11-27 09:40:06
rt
...全文
201 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
voidsky 2009-11-27
  • 打赏
  • 举报
回复
已经搞定了
voidsky 2009-11-27
  • 打赏
  • 举报
回复
进去了
red-fly 2009-11-27
  • 打赏
  • 举报
回复
有进到SetItemCheckState()里面吗?
voidsky 2009-11-27
  • 打赏
  • 举报
回复
顶下自己
voidsky 2009-11-27
  • 打赏
  • 举报
回复
不知道为什么,点击父节点子节点不选中
代码如下:
void CNavDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
NM_TREEVIEW* pHdr = (NM_TREEVIEW*)pNMHDR;
*pResult = 0;
CPoint point;
UINT uFlag;
GetCursorPos(&point);
ScreenToClient(&point);

HTREEITEM item = m_mytree.HitTest(point, &uFlag);
if((item) && (TVHT_ONITEMSTATEICON & uFlag))
{
BOOL bCheck = m_mytree.GetCheck(item);
SetItemCheckState(item, !bCheck);
}
}

void CNavDlg::SetItemCheckState(HTREEITEM item, BOOL bCheck)
{
SetChildCheck(item, bCheck);
SetParentCheck(item, bCheck);
}
void CNavDlg::SetChildCheck(HTREEITEM item, BOOL bCheck)
{
HTREEITEM child = m_mytree.GetChildItem(item);
while(child)
{
m_mytree.SetCheck(child, bCheck);
SetChildCheck(child, bCheck);
child = m_mytree.GetNextItem(child, TVGN_NEXT);
}
}
void CNavDlg::SetParentCheck(HTREEITEM item, BOOL bCheck)
{
HTREEITEM parent = m_mytree.GetParentItem(item);
if(parent == NULL)
return;

if(bCheck)
m_mytree.SetCheck(parent, bCheck);
else
{
HTREEITEM bro = m_mytree.GetNextItem(item, TVGN_NEXT);
BOOL bFlag = false;
while(bro)
{
if(m_mytree.GetCheck(bro))
{
bFlag = true;
break;
}
bro = m_mytree.GetNextItem(bro, TVGN_NEXT);
}
if(!bFlag)
{
bro = m_mytree.GetNextItem(item, TVGN_PREVIOUS);
while(bro)
{
if(m_mytree.GetCheck(bro))
{
bFlag = true;
break;
}
bro = m_mytree.GetNextItem(bro, TVGN_PREVIOUS);
}
}
if(!bFlag)
m_mytree.SetCheck(parent, false);
}
SetParentCheck(parent, bCheck);
}

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧