CTreeCtrl 父结点联动子结点CheckBox
来源:互联网 发布:mac pkg系统盘安装包 编辑:程序博客网 时间:2024/04/30 10:18
来自http://www.cnblogs.com/chain2012/archive/2011/06/22/2086647.html
网上搜索了一番,发现没有一个符合我的要求的,于是自己写。
程序功能实现:在按下父结点的CheckBox后,其子结点全部跟随父结点的CheckBox属性设置。
实现步骤:
1.重载CTreeCtrl的单击事件
void CXMLTree::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult){ NM_TREEVIEW* pHdr = (NM_TREEVIEW*)pNMHDR; CPoint point; UINT uFlag; GetCursorPos(&point); ScreenToClient(&point); HTREEITEM hItem = m_TreeCtrl.HitTest(point, &uFlag); if((hItem) && (TVHT_ONITEMSTATEICON & uFlag)) { // 发送消息,在进行父节点和子节点关联之前判断CheckBox前后的状态 PostMessage(UM_CHECKSTATECHANGE, 0, (LPARAM)hItem); } else { *pResult = 0; }}
2.重载双击时间,屏蔽掉因双击展开结点而改变CheckBox的状态
void CXMLTree::OnNMDblclkTree(NMHDR *pNMHDR, LRESULT *pResult){ *pResult = TRUE;}
3.写自己Post的Message函数
#define UM_CHECKSTATECHANGE (WM_USER + 100)//Message Map里面加这句ON_MESSAGE(UM_CHECKSTATECHANGE, &CXMLTree::OnMyMessage)afx_msg LRESULT CXMLTree::OnMyMessage(WPARAM wParam, LPARAM lParam){ HTREEITEM hItem = (HTREEITEM)lParam; DWORD data = m_TreeCtrl.GetItemData(hItem); BOOL bCheck = m_TreeCtrl.GetCheck(hItem); CString cStrTemp = m_TreeCtrl.GetItemText(hItem); //AfxMessageBox(cStrTemp); if(data==1 && !bCheck) { //AfxMessageBox(_T("Check状态从check到uncheck")); //SetChildCheck(hItem, 0); SetParentChildNodeCheck(hItem, 0); //按下CheckBox后触发的动作 m_TreeCtrl.SetItemData(hItem, 0); } if(data==0 && bCheck) { //AfxMessageBox(_T("Check状态从uncheck到check")); //SetChildCheck(hItem, 1); SetParentChildNodeCheck(hItem, 1); //按下CheckBox后触发的动作 m_TreeCtrl.SetItemData(hItem, 1); } return 0L;}
4.写递归函数,实现父结点关联子结点
BOOL CXMLTree::SetParentChildNodeCheck(HTREEITEM hItem, BOOL bCheck){ if (hItem==NULL) return FALSE; HTREEITEM hChild = m_TreeCtrl.GetChildItem(hItem); SetChildCheck(hChild, bCheck); m_TreeCtrl.SetCheck(hItem, bCheck); return TRUE;}//递归函数void CXMLTree::SetChildCheck(HTREEITEM hItem, BOOL bCheck){ if (hItem == NULL) return; m_TreeCtrl.SetCheck(hItem, bCheck); HTREEITEM hSibling = m_TreeCtrl.GetNextItem(hItem, TVGN_NEXT); while (hSibling) { m_TreeCtrl.SetCheck(hSibling, bCheck); HTREEITEM hSibChild = m_TreeCtrl.GetChildItem(hSibling); if (hSibChild) { SetChildCheck(hSibChild, bCheck); } hSibling = m_TreeCtrl.GetNextItem(hSibling, TVGN_NEXT); } HTREEITEM hChild = m_TreeCtrl.GetChildItem(hItem); if (hChild!=NULL) { SetChildCheck(hChild, bCheck); }}
0 0
- CTreeCtrl 父结点联动子结点CheckBox
- CTreeCtrl 父结点联动子结点CheckBox
- CTreeCtrl:实现子结点随父结点状态一致的方法
- 父结点、子结点、兄弟结点
- CTreeCtrl 联动选择 checkbox
- CTreeCtrl带CHECKBOX属性,实现联动效果(点击父节点全部子节点被选中)
- 建一颗含有checkbox的树并且选中父节点,其子结点也全部被选中
- MFC CTreeCtrl类的结点遍历查找
- 删除子结点
- 访问子结点childNodes
- 父结点
- 获取CTreeCtrl所有结点的附加数据(ItemData)
- VC 删除Tree某一结点下所有子结点
- MSSQL 查找子结点与遍历叶子结点路径
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
- 在自绘CTreeCtrl控件时,双击父结点时,有效区域和字体的区域不同
- c++输出二叉树叶子结点并输出叶子结点到根结点的路径长度
- 删除父结点
- delete 和 delete []的用法(转)经典啊!
- 事务2(java)
- php字符串处理函数大全
- MyReport 2.6.0.0新功能
- Linux Ubuntu-FTP
- CTreeCtrl 父结点联动子结点CheckBox
- 【转载】使用supervisor提高nodejs调试效率
- SOAP TOOLKit3.0
- HashMap封装类CaseInsensitiveHashMap
- 【ScrollView】实现类网页回到顶部FrameLayout+ScrollView+Button
- Python官方3.2文档教程--方法定义-默认参数值
- 在Mac/XCode4中使用github
- VS2008打开时出现devenv.exe 应用程序错误 该内存不能为written
- FileUpload控件实例应用 Excel数据导入数据库