如何实现三态选择树——重点是树的遍历
2005-11-15 18:24
246 查看
有时候我们经常需要实现树的多态选择,本文就介绍一种三态选择树的具体实现。
步骤一:生成一个对话框工程。
步骤二:添加树控件,设置所需的属性。
步骤三:做三态选择框图标,且在OnInitDialog()中初始化树,使树控件与选择框图标所构成的图像列表控件联系,具体实现看源代码。
步骤四:实现树的左击消息,实现三态选择。
TravelChild(HTREEITEM hItem, int m1);
TravelSiblingAndParent(HTREEITEM hItem,int m1); 来实现。
代码如下:
步骤一:生成一个对话框工程。
步骤二:添加树控件,设置所需的属性。
步骤三:做三态选择框图标,且在OnInitDialog()中初始化树,使树控件与选择框图标所构成的图像列表控件联系,具体实现看源代码。
步骤四:实现树的左击消息,实现三态选择。
void CMutiTreeDemoDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) { UINT uFlags=0; HTREEITEM hPItem; CPoint point = GetCurrentMessage()->pt; ScreenToClient(&point); point.Offset(-8,-16); HTREEITEM hItem =m_TripleTree.HitTest(point, &uFlags); if ( (uFlags&TVHT_ONITEM) ) { hPItem=m_TripleTree.GetParentItem(hItem); int m,n,m1,n1; m_TripleTree.GetItemImage(hItem,m,n); if(m!=1) { m_TripleTree.SetItemImage(hItem,1,1); m_TripleTree.GetItemImage(hItem,m1,n1); TravelChild(hItem, m1); if(hPItem!=NULL) TravelSiblingAndParent(hItem,m1); } else if(m==1) { m_TripleTree.SetItemImage(hItem,0,0); m_TripleTree.GetItemImage(hItem,m1,n1); TravelChild(hItem, m1); if(hPItem!=NULL) TravelSiblingAndParent(hItem,m1); } // MessageBox("xxxx"); } *pResult = 0; }这其中,最难实现的是树的遍历,我用递归
TravelChild(HTREEITEM hItem, int m1);
TravelSiblingAndParent(HTREEITEM hItem,int m1); 来实现。
代码如下:
//递归 void CMutiTreeDemoDlg::TravelChild(HTREEITEM hItem,int m) { HTREEITEM hChildItem,hBrotherItem; hChildItem=m_TripleTree.GetChildItem(hItem); m_TripleTree.SetItemImage(hChildItem,m,m); if(hChildItem!=NULL) TravelChild(hChildItem, m); hBrotherItem=m_TripleTree.GetNextSiblingItem(hChildItem); m_TripleTree.SetItemImage(hBrotherItem,m,m); if(hBrotherItem!=NULL) TravelChild(hBrotherItem, m); } void CMutiTreeDemoDlg::TravelSiblingAndParent(HTREEITEM hItem, int m) { int m1,n1; HTREEITEM hNextSiblingItem,hPrevSiblingItem,hParentItem; m1=m; hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hItem); while(hNextSiblingItem!=NULL) { m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1); if(m1!=m) break; else { hNextSiblingItem=m_TripleTree.GetNextSiblingItem(hNextSiblingItem); if(hNextSiblingItem!=NULL) m_TripleTree.GetItemImage(hNextSiblingItem,m1,n1); } } hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hItem); while(hPrevSiblingItem!=NULL) { m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1); if(m1!=m) break; else { hPrevSiblingItem=m_TripleTree.GetPrevSiblingItem(hPrevSiblingItem); if(hPrevSiblingItem!=NULL) m_TripleTree.GetItemImage(hPrevSiblingItem,m1,n1); } } if(m1==m) { hParentItem=m_TripleTree.GetParentItem(hItem); if(hParentItem!=NULL) { m_TripleTree.SetItemImage(hParentItem,m1,m1); TravelSiblingAndParent(hParentItem,m1); } } if(m1!=m) { hParentItem=m_TripleTree.GetParentItem(hItem); while(hParentItem!=NULL) { m_TripleTree.SetItemImage(hParentItem,2,2); hParentItem=m_TripleTree.GetParentItem(hParentItem); } } }
相关文章推荐
- 如何实现三态选择树——重点是树的遍历
- 如何实现三态选择树
- Swift 2.0实战:如何实现从非零下标遍历数组?
- 遍历List时如何选择使用for each 与for循环
- WinRT界面控件Essential Studio使用教程:如何实现选择时间范围
- 【转】如何实现点击textbox显示monthCalendar 选择monthCalendar把值传给textbox
- ListView控件演示06:如何实现用户同时选择多个列表项
- javascript操作两个选择列表(有两个列表,如何实现在一个列表通过双击和多选列表中内容添加到另一个列表. )
- 如何实现EditPlus、UE等工具的列选择,并且将选择的列复制到word中的表格
- android studio 如何实现RadioBotto和RadioGroup来实现单选按钮的选择
- 如何用堆栈实现后序遍历的非递归程序
- JQuery实现下拉框的选择 与当CheckBox为服务器控件时如何获取值的操作,实现全选与删除
- 拦截器springmvc防止表单重复提交【3】3秒后自动跳回首页【重点明白如何跳转到各自需要的页面没有实现 但是有思路】
- 如何选择合适的容器以及其实现品
- Scala深入浅出进阶经典 第82讲:Scala中List的ListBuffer是如何实现高效的遍历计算的
- 如何实现一个checkbox选择框
- 如何解决FormView中实现DropDownList连动选择时出现 "Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误
- 如何实现多风格选择 样式实时切换
- iOS每日一记————————如何实现一个checkbox选择框
- Scala深入浅出实战经典 第82讲:Scala中List的ListBuffer是如何实现高效的遍历计算的?