社区
界面
帖子详情
关于树控件 复选框 打勾的 问题
miaoshengwu
2009-04-08 05:32:25
现在有一棵树,各项前有复选框(check boxes),
当点击根节点,
根节点处于选中状态,
其子节点却是不选中状态。
再点击一次根节点,
此时根节点处于不选中状态,
其子节点却处于选中状态,
有没有办法使它们保持一致?
...全文
573
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
通过设置图形的属性节点,活动曲线以及曲线是否可见来实现用
复选框
控制对应曲线波形的有无,非常实用!
QT的QTreeWidget有checkbox时轻松选中
QT的QTreeWidget有checkbox时轻松选中,自己项目中遇到的
问题
,单击行的其他部分,checkbox框也能打钩,解决了,共享一下。
用WPF自定义CheckBox的样式(框框和钩钩)
在WPF中自定义了CheckBox的新样式,主要是改变了那个框框和钩钩
asp.net 获取TreeView中第一个选中的节点
今天做的项目中有一个要获取TreeView中第一个选中的节点,当然子节点己包含checkbox以前做过,用的时候又不知道怎么做了,花了点时间又写了一下,记录下来,以备下次用.
winform中TreeView
控件
复选框
联动时鼠标点击过快导致的显示不正确的
问题
今天我在试着做一个C#
树
形视图(TreeView)
控件
,要求在每个节点前面添加一个可用于
打勾
的
复选框
,并要求
复选框
有上下级联动的效果。现在在网上能查到挺多满足这类功能的代码,原本我也以为这是一件挺简单的事情,不过实际情况并非如此。 我们建立一个C#窗体应用程序,主窗体取名FormMain,在里面放置一个Dock为Fill的TreeView
控件
treeTest。注意该
控件
的CheckBoxes属性要设置为True才能显示
复选框
。 在FormMain中写入代码如下: using System; using S
界面
15,978
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章