社区
界面
帖子详情
关于树控件 复选框 打勾的 问题
miaoshengwu
2009-04-08 05:32:25
现在有一棵树,各项前有复选框(check boxes),
当点击根节点,
根节点处于选中状态,
其子节点却是不选中状态。
再点击一次根节点,
此时根节点处于不选中状态,
其子节点却处于选中状态,
有没有办法使它们保持一致?
...全文
570
9
打赏
收藏
关于树控件 复选框 打勾的 问题
现在有一棵树,各项前有复选框(check boxes), 当点击根节点, 根节点处于选中状态, 其子节点却是不选中状态。 再点击一次根节点, 此时根节点处于不选中状态, 其子节点却处于选中状态, 有没有办法使它们保持一致?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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里添加相关语句
labview-data.rar_LABVIEW
复选框
_labview
复选框
_labview曲线可见_可见labview
首先,
复选框
是LabVIEW中的布尔
控件
,用于表示一个开/关状态或选择/未选择状态。在描述的项目中,
复选框
被用来作为开关,决定某个曲线是否在图表上显示。当
复选框
被选中时,对应的曲线显示;反之,不显示。实现这一...
QT的QTreeWidget有checkbox时轻松选中
在QTreeWidget中添加
复选框
(checkbox)功能,可以让用户选择或取消选择特定的项,这对于多选操作或者配置界面非常有用。在实际开发中,我们可能会遇到一个
问题
:当用户点击QTreeWidget中的某一行,但不是直接点击复...
用WPF自定义CheckBox的样式(框框和钩钩)
CheckBox是WPF中一个基础的
复选框
控件
,通常用于用户可以选择或取消选择一个选项。默认情况下,CheckBox有一个矩形框和一个可选中的勾号。要自定义这些元素,我们需要使用样式(Style)和模板(Template)。 1. **...
asp.net 获取TreeView中第一个选中的节点
在这个场景中,用户可能会选择不同的节点,或者为子节点的
复选框
打勾
。本文档讨论了如何获取TreeView中第一个被选中节点的实现方法。 在TreeView
控件
中,每个节点都可以是一个TreeNode对象。TreeNode类提供了属性和...
winform中TreeView
控件
复选框
联动时鼠标点击过快导致的显示不正确的
问题
今天我在试着做一个C#
树
形视图(TreeView)
控件
,要求在每个节点前面添加一个可用于
打勾
的
复选框
,并要求
复选框
有上下级联动的效果。现在在网上能查到挺多满足这类功能的代码,原本我也以为这是一件挺简单的事情,...
界面
15,980
社区成员
115,867
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章