CTreeCtrl的用法

8 篇文章 0 订阅

CTreeCtrl的用法

树控制(CTreeCtrl)主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。树控制中的每个数据项包括数据项名称的文本字符串和用于表示该数据项的图像,每个数据项下面均可包含各种子项,整个结构就象目录树一样。对于包含各种子项的数据项,可通过鼠标双击来展开或合拢,这可以通过控制树的不同风格来实现树控制的不同显示形态。

建立控件

CtreeCtrl&treeCtrl 建立树控制对象结构
Create 建立树控制并绑定对象
树控制 CTreeCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定树控制的类型;rect用来确定树控制的大小和位置;pParentWnd用来确定树控制的父窗口,通用是一个对话框并且不能为NULL;nID用来确定树控制的标识。树控制的风格可以是下列值的组合:
TVS_HASLINES 表示树控制在各子项之间存在连线;
TVS_LINESATROOT 表示树控制在根项之间存在连线;
TVS_HASBUTTONS 表示树控制视在父项左侧存在展开合拢控制按钮;
TVS_EDITLABELS 表示可以控制鼠标单击修改树项的名称;
TVS_SHOWSELALWAYS 表示选中项即使在窗口失去 输入焦点时仍然保持选中状态;
TVS_DISABLEDRAGDROP表示禁止树控制发送TVN_BEGINDRAG消息

控件属性

树控制属性类包括取得树控制中项数GetCount、取得树控制中项相对于父项的偏移值GetIndent、取得树控制图像列表控制句柄GetImageList、设置树控制图像列表控制句柄SetImageList、取得匹配下一个树项 GetNextItem、判断给定树项是否包含子项ItemHasChildren、取得树项子项GetChildItem、取得下一个同属树项GetNextSiblingItem、取得前一个同属树项GetPrevSiblingItem、取得父树项GetParentItem、取得第一个可视树项GetFirstVisibleItem、取得下一个可视树项GetNextVisible Item、取得前一个可视的树项GetPrevVisibleItem、取得被选中的树项GetSelectedItem、取得根树项GetRootItem、取得树项的属性GetItem、设置树项的属性SetItem、取得树项的状态GetItemState、设置树项的状态SetItemState、取得与树项关联图像GetItemImage、设置与树项关联图像SetItemImage、取得树项文本GetItemText、设置树项文本 SetItemText和取得树项编辑控制句柄GetEditControl等。

操作方法

树控制的操作方法包括插入一个树项 InsertItem、删除一个树项DeleteItem、删除所有树项DeleteAllItems、展开或合拢树项的子项Expand、选中特定树项SelectItem、选择一个树项作为第一个可视树项SelectSetFirstVisible、编辑一个可视的树项EditLabel和排序给定父树项的子树项SortChildren等。

数据结构

在使用树控制时需要了解两个个非常重要的数据结构TV_ITEM和 TV_INSERTSTRUCT,前一个数据结构是用来表示树控制的树项信息,后一个数据结构是用来定义将树项增加到数据控制中所需要的数据内容。另外,还需要NM_TREEVIEW、TV_DISPINFO和TV_HITTESTINFO三个数据结构,这几个数据结构的定义方法如下:
①基本 数据项结构
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;
②插入树项结构
typedef struct _TV_INSER TSTRUCT {
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 { tvdi
NMHDR hdr; //通知消息控制句柄
TV_ITEM item; // 数据项结构
} TV_DISPINFO;
⑤指针测试 数据结构
typedef struct _TVHITTESTINFO { tvhtst
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 在客户区域的右侧

 

 

 

-----------------------------------

1.取得或设定项目的信息.

BOOL CTreeCtrl::GetItem(TV_ITEM* pItem);
BOOL CTreeCtrl::SetItem(TV_ITEM* pItem);
BOOL CTreeCtrl::SetItem(HTREEITEM hItem,UINTnMask,LPCTSTR lpszItem,int Image,int nSelectedImage,UINT nState,UINT nStateMask,LPARAME lParam);

2.取得与设定项目的状态

UINT CTreeCtrl::GetItemState(HTREEITEM hItem,UINT sStateMask)const;
BOOL CTree Ctrl::SetItemState(HTREEITEM hItem,UINT nState,UINT nStateMask);

3.取得与设定项目的图形

BOOL CTreeCtrl::GetItemImage(HTREEITEM hItem,int& nImage,int& nSelectedImage)const;
BOOL CTreeCtrl::SetItemImage(HTREEITEM hItem,int nImage,int nSelectedImage);

4. 取得与设定项目的文本

CString CTreeCtrl::GetItemText(HTREEITEM,hItem)const;
BOOL CTreeCtrl::SetItemText(HTREEITEM hItem,LPCTSTR lpszItem);

5. 查询 CTreeCtrl 中项目的个数

UINT CTreeCtrl::GetCount();

6.查询hItem 的父项目的句柄

HTREEITEM CTreeCtrl::GetparenItem(HTREEITEM hItem);

7.查询hItem是否有子项

BOOL CTreeCtrl::ItemHasChildren(HTREEITEM hItem);

8.取得hItem 第一个子项的句柄

HTREEITEM CTreeCtrl::GetChildItem(HTREEITEM hItem);

9.查询排在hItem前后的兄弟项

HTREEITEM CTreeCtrl::GetPrevSiblingItem(HTREEITEM hItem);
HTREEITEM CTreeCtrl::GetNextSiblingItem(HTREEITEM hItem);

10.取得选中项的句柄 取得根项的句柄

HTREEITEM CTreeCtrl::GetSelectedItem();

HTREEITEM CTreeCtrl::GetRootItem();

HTREEITEM hItem=GetRootItem(); //获取根结点,可能会有多个根结点

ItemHasChildren(hParent) //判断结点是否有孩子结点

hItem=GetChildItem(hParent); //获取第一个子结点

hItem=GetNextSiblingItem(hItem)); //获取下一个兄弟结点结点

Expand(hItem,bExpand?TVE_EXPAND:TVE_COLLAPSE);//展开/叠起结点

Select(hItem,TVGN_FIRSTVISIBLE); //设置选中结点

CString str=GetItemText(hChild); //获取结点字符串信息

HTREEITEM hCurrSel = GetSelectedItem(); //获取当前选中结点

SelectItem(hNewSel);

HTREEITEM hNewSel = HitTest(pt, &nFlags); //判断坐标是否在当前结点范围内

HTREEITEM hItem=InsertItem(dlg.m_strItemText,hItemParent); //插入结点

//

CTreeCtrl m_TripleTree;

CImageList m_imgList;
CImageList m_imgState;

/*
CImageList ImgTree;
ImgTree.Create (16,16,ILC_COLOR|ILC_MASK,3,3);//
创建图标列表图标为单个图标
ImgTree.Add (AfxGetApp()->LoadIcon (IDI_CK));
ImgTree.Add (AfxGetApp()->LoadIcon (IDI_BASE_INFO));
ImgTree.Add (AfxGetApp()->LoadIcon (IDI_INPUT));
*/
m_imgList.Create(IDB_BITMAP_LIST,16, 1, RGB(255,255,255));//
创建图标列表为连续的16*16图标
//m_imgState.Create(IDB_BITMAP_STATE,16, 1, RGB(255,255,255));//
创建状态图标
m_TripleTree.SetImageList(&m_imgList,TVSIL_NORMAL);//
选择与非选择
//m_TripleTree.SetImageList(&m_imgState,TVSIL_STATE);//
用户定义

HTREEITEM hItem1A=m_TripleTree.InsertItem(_T("根部"),0,0);
      
HTREEITEM hItem2_1B=m_TripleTree.InsertItem(_T("
根上一"),1,2,hItem1A,TVI_LAST);
m_TripleTree.InsertItem(_T("
根上二"1,2,hItem2_1B); 
m_TripleTree.InsertItem(_T("
根上二"),1,2,hItem2_1B);

HTREEITEM hItem2_2B=m_TripleTree.InsertItem(_T("根上一"),1,2,hItem1A,TVI_LAST);
m_TripleTree.InsertItem(_T("
根上一"),1,2,hItem2_2B); 
m_TripleTree.InsertItem(_T("
根上一"),1,2,hItem2_2B);

   m_TripleTree.InsertItem(_T("根上一"),1,2,hItem1A,TVI_LAST);
m_TripleTree.InsertItem(_T("
根上一"),1,2,hItem1A,TVI_LAST);
    
    //
设置显示风格
m_TripleTree.SetBkColor (RGB(220,200,220));//
背景颜色
m_TripleTree.Expand(hItem1A,TVE_EXPAND);//
根部展开
DWORD dwStyle=GetWindowLong(m_TripleTree.m_hWnd ,GWL_STYLE);//
获得树的信息
dwStyle|=TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT;//
设置风格
::SetWindowLong (m_TripleTree.m_hWnd ,GWL_STYLE,dwStyle);


来源:http://blog.csdn.net/ghevinn/article/details/17499691

补充:

CTreeCtrl设置了各种节点以后怎么设置他自动展开

CTreeCtrl的Expand(HTREEITEM hItem,UINT nCode)函数。
如果要操作根节点HTREEITEM hItem处填TVI_ROOT。
nCode:操作类型
TVE_COLLAPSE收缩所有节点
TVE_COLLAPSERESET收缩所有节点,移除子节点
TVE_EXPAND展开所有节点
TVE_TOGGLE展开或收缩当前节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值