关于树控件 复选框 打勾的 问题

miaoshengwu 2009-04-08 05:32:25
现在有一棵树,各项前有复选框(check boxes),
当点击根节点,
根节点处于选中状态,
其子节点却是不选中状态。
再点击一次根节点,
此时根节点处于不选中状态,
其子节点却处于选中状态,
有没有办法使它们保持一致?
...全文
568 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
snow_man_J 2012-08-15
  • 打赏
  • 举报
回复
你给的是一个派生类的函数吗,但我不知道怎么用这个派生类啊,楼上的大侠能说说嘛
bearsuper 2009-04-17
  • 打赏
  • 举报
回复
选择树哦,给你例子吧,就给关键函数:

void CTreeEx::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

HTREEITEM hItem = HitTest(point, &nFlags);
BOOL bCheck = GetCheck(hItem);

CTreeCtrl::OnLButtonDown(nFlags, point);

if (hItem != NULL)
{
SelectItem(hItem);
UpdateCheck(hItem);
}
}


void CTreeEx::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags);

if(nChar==0x20)
{
HTREEITEM hItem = GetSelectedItem();
if (hItem != NULL)
{
UpdateCheck(hItem);
::SendMessage(GetParent()->GetSafeHwnd(), WM_CHECK_CHANGE, NULL, NULL);
}
}
}

void CTreeEx::UpdateCheck(HTREEITEM hItem)
{
BOOL bCheck = GetCheck(hItem);

// 以下遍歷所有子節點, 更新他們的選擇狀態
SetChildCheck(hItem, bCheck);

// 以下遍歷所有兄弟和父節點, 更新他們的選擇狀態
SetParentCheck(hItem, bCheck);

}

void CTreeEx::SetChildCheck(HTREEITEM hItem, BOOL bCheck)
{
HTREEITEM hLeaf;
hLeaf = GetChildItem(hItem);

// 遞歸遍歷所有子節點, 設定他們的狀態
while (hLeaf != NULL)
{
SetChildCheck(hLeaf, bCheck);
SetCheck(hLeaf, bCheck);

hLeaf = GetNextItem(hLeaf, TVGN_NEXT);
}
}

void CTreeEx::SetParentCheck(HTREEITEM hItem, BOOL bCheck)
{
HTREEITEM hParent = GetParentItem(hItem);
HTREEITEM hBrother = GetChildItem(hParent);
BOOL bAllCheck = TRUE;

if (bCheck) // 選中的情況
{
if (hParent != NULL)
{
// 檢視所有的兄弟節點
while (hBrother != NULL)
{
if (!GetCheck(hBrother))
{
bAllCheck = FALSE;
break;
}

hBrother = GetNextItem(hBrother, TVGN_NEXT);
}

if (bAllCheck)
{
SetCheck(hParent, TRUE);
SetParentCheck(hParent, TRUE);
}
}
}
else // 不選的情況
{
// 把所有的父親節點全部置為不選中
if (hParent != NULL)
{
SetParentCheck(hParent, FALSE);
SetCheck(hParent, FALSE);
}
}
}
fishion 2009-04-08
  • 打赏
  • 举报
回复
不会难道GetCheck返回了一个错误的值--!!
miaoshengwu 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fishion 的回复:]
你每次点击的时候都用GetCheck检查,是选中状态的话,就其全部子节点SetCheck(TRUE),不是的话选中状态的话就其全部子节点SetCheck(FALSE)
[/Quote]
===========================
子节点的状态都是正确的,
就是我点击的那个节点状态不对,
和它的子节点是反着的,
fishion 2009-04-08
  • 打赏
  • 举报
回复
你每次点击的时候都用GetCheck检查,是选中状态的话,就其全部子节点SetCheck(TRUE),不是的话选中状态的话就其全部子节点SetCheck(FALSE)
miaoshengwu 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fishion 的回复:]
添加WM_LBUTTONDOWN事件,用Ctreectrl中的hittest来判断点击是否在根节点上,用GetCheck检查当前的根节点不是不选中状态,是的话其子节点就SetCheck
[/Quote]
==============================
这个我试过,可以的,
但是有一个问题,就是我上面所说的,
根节点处于选中状态时,子节点处于非选中状态,
根节点处于非选中状态时,子节点处于选中状态,
现在是这个问题,该如何解决?
fishion 2009-04-08
  • 打赏
  • 举报
回复
不用WM_LBUTTONDOWN的话,,也可以用TVN_SELECTCHANGING
fishion 2009-04-08
  • 打赏
  • 举报
回复
添加WM_LBUTTONDOWN事件,用Ctreectrl中的hittest来判断点击是否在根节点上,用GetCheck检查当前的根节点不是不选中状态,是的话其子节点就SetCheck
寒冰雪 2009-04-08
  • 打赏
  • 举报
回复
从CTreeCtrl派生一个类,在OnNMClick里添加相关语句

15,979

社区成员

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

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