社区
界面
帖子详情
关于树控件 复选框 打勾的 问题
miaoshengwu
2009-04-08 05:32:25
现在有一棵树,各项前有复选框(check boxes),
当点击根节点,
根节点处于选中状态,
其子节点却是不选中状态。
再点击一次根节点,
此时根节点处于不选中状态,
其子节点却处于选中状态,
有没有办法使它们保持一致?
...全文
599
9
打赏
收藏
关于树控件 复选框 打勾的 问题
现在有一棵树,各项前有复选框(check boxes), 当点击根节点, 根节点处于选中状态, 其子节点却是不选中状态。 再点击一次根节点, 此时根节点处于不选中状态, 其子节点却处于选中状态, 有没有办法使它们保持一致?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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里添加相关语句
MFC
树
控件
含有checkbox的鼠标点击处理
首先要在
树
控件
属性上加上checkbox;或者用代码; MFC鼠标点击消息 afx_msg void OnNMClickTreeUnitshow(NMHDR *pNMHDR, LRESULT *pResult); ON_NOTIFY(NM_CLICK, IDC_TREE_UNITSHOW, OnNMClickTreeUnitshow) 代码控制 void CSelectUnit
解决MFC
树
控件
Tree-view的Checkbox通过代码设置
打勾
SetCheck无效
在OnInitDialog()中加入以下两行代码解决: m_treeCtrl.ModifyStyle(TVS_CHECKBOXES, 0); m_treeCtrl.ModifyStyle(0, TVS_CHECKBOXES); 第一句,表示移除TVS_CHECKBOXES风格,第二句,添加TVS_CHECKBOXES风格。...
国央企创新负责人在推动企业转型时,如何获取最新的行业技术趋势和竞争情报?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
科技中介服务机构如何通过产业大脑提升服务效率与客户粘性?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
界面
15,976
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章