用VC++构建树视图控件

来源:互联网 发布:caxa方块线切割编程 编辑:程序博客网 时间:2024/06/13 00:54
树视图控件具有层次分明、结构化强、美观、灵活等特点,在各种操作系统中广为应用,是人们最熟悉、最常应用的控件。 

  从树视图控件出现到现在,它们一直被认为非常复杂并难于编程,与其它如编辑框、单选钮、复选框等控件进行比较,要使其正常运行,开发人员需要多做一些工作。然而,在使用复杂的同时,树视图控件又提供给开发人员更多的能力与空间。这里笔者就VC++中树视图控件的编程使用作一些介绍。 

  MFC提供的树视图控件CTreeCtrl类用于封装树视图控件的功能,同时它只是一个很“瘦”的包装器。它应用在对话框中或视图窗体中,同其他控件一样,可直接拖放到窗口中,改变其位置、大小和一些基本属性。 

  下面开始建立一个CTreeCtrl,步骤如下: 

  1.将CtreeCtrl拖到视图窗口中,调整位置、大小,并定义其对象标识为IDC_TREE。 

  2.改变其属性,选中Has buttons、Has lines复选框,这样用起树视图控件就同Windows中资源管理器中的一样了。 

  3.定义一个从CtreelCtrl继承的类CNewTree,在MFC ClassWizard中建立对新定义类的成员变量为m_MyTree,以后程序中对该控件的控制通过此成员变量来实现。这么做是为了以后方便对其添加其他用户自定义的功能。 

  做完以上几步,我们就可以开始编写代码了。首先,初始化树视图控件,为其关联一个图像列表;然后,用InsertItem函数增加节点。在视图窗口CMyFormView中的OnInitialUpdate()事件中加入下面代码: 

  同CtreeView相比,CtreeCtrl是CtreeView的一个“轻巧”版本,编程也相对简单。 

void CMyFormView::OnInitialUpdate() 

HICON hIcon[7]; 
CImageList m_imagelist; 
m_imagelist.Create(16,16,0,7,7); 
//建立一个图像列表 
m_imagelist.SetBkColor (RGB(255,255,255));hIcon[0]=AfxGetApp()-〉LoadIcon (IDI_ BMP0); hIcon[1]=AfxGetApp()-〉LoadIcon (IDI_ BMP1); 
…… 
hIcon[6]=AfxGetApp()-〉LoadIcon (IDI_ BMP6); 
for(int i=0;i〈=6;i++) 

m_imagelist.Add (hIcon[i]); 

m_MyTree.SetImageList (&&m_imagelist,TVSIL_NORMAL) 
//为m_MyTree设置一个图像列表,使CtreeCtrl的不同节点显示不同的图标 
HTREEITEM m_item 
m_item=m_MyTree.InsertItem ("Root",0,0,0,0); 
//根节点的图标为IDI_BMP0 
if (m_item!=NULL) 
//根节点建立成功 

m_MyTree.InsertItem("SubItem1",1,1,m_item) 
//在根节点下建立一个子节点名为SubItem1,所显示的图标为IDI_BMP1。同理,可建立其它节点,同一层次的节点显示相同的图标 

…… 
}
  CtreeCtrl类没有提供节点查找的函数,所以要求程序员自己编写特定条件的查找函数。 

  通常点击不同节点所触发的事件是不同的,此时,要增加OnSelchangedTree事件。在ClassWiard窗口中,选择CmyFormView类,对象标识为IDC_TREE,消息为TVN_SELCHANGED,添加函数,然后编辑代码。 

void CMyFormView::OnSelchangedTree(NMHDR pNMHDR, LRESULT pResult) 

HTREEITEM SelItem; 
MyStructure ItemData; //MyStructure为用户定义的结构类型 
SelItem=m_MyTree.GetSelectedItem (); 
ItemData=GetItemData(SelItem); 
//获得该节点的数据指针 
Switch (ItemData-〉value1) 

case 0:{……} 
//用户指定的操作 
case 1:{……} 
…… 

}
  在实际编程中,可能不仅仅是为了显示,树视图控件上的每一个节点都对应特定的值,所以要将指向具体数据的指针赋给对应的节点。具体做法是在用户自定义类CNewTree中新增一过程SetValue(HTREEITEM)。具体代码如下: 

void CNewTree::SetValue(HTREEITEM Item_parm,int Value1,int value2…..) 

MyStructure ItemData 
ItemData= new MyStructure;; 
ItemData-〉value1=value1; 
ItemData-〉value2=value2; 
…… 
SetItemData(Item_parm ,(DWORD)ItemData); 
}
  调用时,传入对应的参数,即可对给定的节点赋值。当然这里用了动态分配地址new,因此,在程序结束前,一定不要忘记删除这些空间。 

void CNewTree::DeleteData(HTREEITEM Item) 

MyStructure ItemData; 
ItemData=GetItemData(Item); 
//获得该节点的数据指针 
if (ItemData!=NULL){ delete[] (char)ItemData;} 
//删除所占用的空间 
…… 
}
  根据树视图的结构特点,我们采用递归遍历的方法来查找节点,当然你可根据条件缩小遍历的范围。这里笔者以节点值匹配为条件,编写自定义的函数FindNode(),返回第一个符合条件的节点的句柄,具体代码如下: 

HTREEITEM CNewTree::FindNode(HTREEITEM NodeItem, int &&NodeValue) 

MyStructure ItemData; 
HTREEITEM NextItem; 
if(NodeItem= =NULL) 
return NULL; 
//递归出口 
else 

while(NodeItem!=NULL) 

ItemData=GetItemData(NodeItem); 
If (ItemData-〉value1= =NodeValue) 
return NodeItem; 
NodeItem=GetChildItem(NodeItem); 
//得到当前节点的第一个子节点的句柄 
If(FindNode(NodeItem, NodeValue)= =NULL); 
//递归查找 
NodeItem=GetNextSiblingItem(NodeItem); 
//得到当前节点的兄弟节点的句柄 


}
  到此为止,笔者介绍了一些树视图控件编程方法,包括树视图控件的建立、节点值的赋予和删除、查找。当然,它应用的方面很广,使用方法也很多。这里提供了构建树视图控件的基本框架,在此基础上,可进行扩展,从而完成更强大的功能,如同列表视图控件结合,为其加上弹出式选单等等。感兴趣的读者不妨自己扩展该控件试试。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 考编报到证丢了怎么办 2017报到证丢了怎么办 携程机票不能退怎么办 暗黑3进度全没了怎么办 从飞机上掉下来怎么办? 白带多有酸臭味怎么办 私募基金跑路了怎么办 车险的保单丢了怎么办 做的3d有病毒怎么办 猫吐白沫没精神怎么办 光伏发电坏了怎么办 户户通违规移机怎么办 原岳阳恒立地块怎么办 发票打错一个字怎么办 香港自由行g签证怎么办 小米5铃声不响怎么办 德龙驾驶室爱跳怎么办 高低速的车换挡怎么办 挂车鞍座间隙大怎么办 自考本科证丢了怎么办 学籍号密码忘了怎么办 嘀嘀虎没流量了怎么办 被房产中介骗了怎么办 孕中期胎盘早剥怎么办 船用雷达不扫描怎么办? 招工年龄报小了怎么办 三茅hr app闪退怎么办 ipad开关键坏了怎么办 档案单位给丢了怎么办 单位把档案弄丢了怎么办 北京集体户口离职后怎么办 群面遇到辩论题怎么办 学校派遣证丢了怎么办 派遣证过期10年怎么办 中专派遣证丢了怎么办 档案派遣证丢了怎么办 毕业派遣证丢了怎么办 派遣证遗失五年怎么办 卵泡太大排不出来怎么办 撞了大使馆的车怎么办 居住证过期5年了怎么办