TreeCtrl的用法(1)
(一)树控件的主要功能,
树控件和树视图(Tree Control & View)主要用来显示 具有一定层次结构的 数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。树控件中的每个数据项包括“数据项名称的文本字符串”和“用于表示该数据项的图像”,每个数据项下面均可包含各种子项,整个结构就像目录树一样。对于包含各种子项的数据项,可通过鼠标双击来展开或合拢,可以通过控制树的不同风格来实现树控件的不同显示形态。这些风格主要包括:
TVS_HASLINES表示用连线来连接父项和它下面的各个子项,这可以使树的显示层次结构更加清晰,但无父项的各子项之间并没有连线。
TVS_LINESATROOT表示在无父项的各子项 即根下面的各子项 存在连线。
TVS_SHOWSELALWAYS表示选中项即使在窗口失去焦点时仍然保持选中状态。
TVS_DISABLEDRAGDROP表示禁止对树控件发送TVN_BEGINDRAG消息。
TVS_HASBUTTONS表示在带有子项的父项前增加一个带“+”或“-”按钮,这使得用户可以通过单击这个小按钮来实现子项的展开和合拢,当存在子项时,按钮的初始状态为“+”,当子项被展开时,小按钮由“+”变为“-”,当子项合拢时,小按钮由“-”变为“+”,这一风格对于根项无效,如果需要可通过组合TVS_LINESATROOT风格来实现;TVS_EDITLABELS表示允许让用户单击具有输入焦点的数据项来修改其名称。
对于树控件,MFC中叶可以2种形式来封装,即树控件(CTREECTRL)和数视图(CTREEVIEW),来满足用户的不同需求,对于一般要求的用户如果在对话框中应用,使用树控件比较方便。而对于具有较高要求的用户,在使用 树视图 时还具有视窗口的各种方便特性,可以更好的满足文档/视结构的要求。当在窗口中使用数视图时,树视图会占满两个窗口的客户区域并自动随框架窗口的调整而调整,并能够很好的处理诸如菜单、加速键、工具条中的各种命令消息。在使用树视图时,只要利用CTreeView的成员函数GetTreeCtrl()取得树控件的一个引用,就可以像操作树控件一样来使用树视图。
(二)树控件的 对象结构
1、树控件的建立方法
(1)定义树控件类的对象CTreeCtrl m_treeCtrl;
(2)调用该对象的Create函数,其调用格式如下:BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID);
其中dwStyle用来确定树控件的类型,rect用来确定树控件的大小和位置,pParentWnd用来确定树控件的父窗口,通常为一个对话框,不能为NULL,你ID用来确定树控件的标志。树控件的风格可以是上面介绍的风格的组合。
2、树控件的操作函数
(1)GetCount()取得树控件中项的数目
(2)取得树控件中相对于父项的偏移值GetIndent()
(3)取得树控件图像列表的句柄GetImageList()
(4)取得匹配下一个树项GetNextItem()
(5)判断给定树项是否包含子项ItemHasChildren()
(6)取得树项子项GetChildItem()
(7)取得下一个同属树项GetNextSiblingItem()
(8)取得前一个同属树项GetPrevSiblingItem()
(9)取得父树项GetParentItem
(10)取得第一个可视树项GetFirstVisibleItem()
(11)取得下一个可视树项GetNextVisibleItem()
(12)取得前一个可视树项GetPrevVisibleItem()
(13)取得被选中的树项 GetSelectedItem()
(14)取得根树项GetRootItem()
(15)取得树项的属性GetItem()
(16)设置树项的属性SetItem()
(17)取得树项的状态 GetItemState()
(18)设置树项的状态SetItemState()
(19)取得与树项关联图像GetItemImage()
(20)设置与树项关联图像 SetItemImage()
(21)取得树项文本GetItemText()
(22)设置树项文本SetItemText()
(23)取得树项编辑控件句柄 GetEditControl()
3、树控件的操作方法
树控件的操作方法包括:
(1)插入一个树项InsertItem()
(2)删除一个树项DeleteItem()
(3)删除所有树项DeleteAllItems()
(4)展开或合拢树项 的子项Expand()
(5)选中特定树项SelectItem()
(6)选择一个树项作为第一个可视树项SelectSetFirstVisible()
(7)编辑一个可视的树 项EditLabel()
(8)排序给定父树项的子树项SortChildren()
(三)与树控件相关的数据结构
在使用树控件时需要了解两个非常重要是数据结构TV_ITEM和TV_INSERTSTRUCT。前一个数据结构用来表示树控件的树项信息,后一个数据结构是用来定义 将树项增加到树控件中 所需要的树项信息。另外,还需要NM_TREEVIEW、TV_DISPINFO和TV_HITTESTINFO数据结构,这几个数据结构的定义方法如下:
(1)基本数据项结构 typedef struct _TV_ITEM { UINT mask; //结构成员有效性屏蔽位 HTREEITEM hItem; //数据项控制句柄 UINT state; //数据项状态 UINT stateMask; //状态有效性屏蔽位 LPSTR pszText; //数据项名称字符串 int cchTextMax; //数据项名称的最大长度 int iImage; //数据项图标索引号 int iSelectedImage; //选中数据项图标索引号 int cChildren; //子项标识 LPARAM lParam; //程序定义的32位数据 } TV_ITEM, FAR *LPTV_ITEM; (2)插入树项结构 typedef struct _TV_INSERTSTRUCT { HTREEITEM hParent; //父项控制句柄 HTREEITEM hInsertAfter; //插入树项的位置 TV_ITEM item; //数据项的结构 } TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT; 说明:如果插入位置是TVI_FIRST或TVI_LAST,则分别插入到树控件的最前面或最后面,如果是TVI_SORT,则插入的树项自动插入到合适的位置。 ③树控制通知消息结构 typedef struct _NM_TREEVIEW { NMHDR hdr; //通知消息句柄 UINT action; //通知消息标志 TV_ITEM itemOld; //原来的数据结构 TV_ITEM itemNew; //新的数据结构 POINT ptDrag; //拖动指针 } NM_TREEVIEW; ④取得或设置数据结构 typedef struct _TV_DISPINFO { NMHDR hdr; //通知消息控制句柄 TV_ITEM item; //数据项结构 } TV_DISPINFO; ⑤指针测试数据结构 typedef struct _TVHITTESTINFO { POINT pt; //客户区域屏幕坐标指针 UINT flags; //存放测试结果的变量 HTREEITEM hItem; //测试的数据项结构 } TV_HITTESTINFO, FAR *LPTV_HITTESTINFO; 其中flags测试结果可以是如下值: TVHT_ABOVE 在客户区域上面 TVHT_BELOW 在客户区域下面 TVHT_NOWHERE 在客户区域中并在最后一项下面 TVHT_ONITEM 在与树项关联的位图或标签内 TVHT_ONITEMBUTTON 在与树项关联的按钮上 TVHT_ONITEMICON 在与树项关联的位图上 TVHT_ONITEMINDENT 在与树项关联的联线上 TVHT_ONITEMLABEL 在与树项关联的标签上 TVHT_ONITEMRIGHT 在树项的右侧区域中 TVHT_ONITEMSTATEICON 在用户定义的状态图标上 TVHT_TOLEFT 在客户区域的左侧 TVHT_TORIGHT 在客户区域的右侧