Win32 SDK学习笔记_树形控件(TreeCtrl)

树形控件类名:SysTreeView32

1。控件的创建

DWORD dwSTyle=WS_CHILD | WS_VISIBLE | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS;

//创建树形控件,要添加头文件#include <commctrl.h>
HWND hTree = CreateWindowEx(WS_EX_CLIENTEDGE, //WS_EX_CLIENTEDGE窗口下陷的扩展风格样式
				TEXT("SysTreeView32"), 
				nullptr,
				dwStyle,
				10, 10, 200, 300, 
				hWnd, 
				0, 
				hInstance, 
				0);

在这里插入图片描述

2.控件样式

TVS_HASLINES 		在父项与子项间连线以清楚地显示结构.
TVS_LINESATROOT 	只在根部画线.
TVS_HASBUTTONS 		显示带有"+"或"-"的小方框来表示某项能否被展开或已展开.
TVS_EDITLABELS 		用户可以编辑表项的标题.
TVS_SHOWSELALWAYS 	即使控件失去输入焦点,仍显示出项的选择状态.
TVS_DISABLEDRAGDROP 不支持拖动操作.
TVS_TRACKSELECT		启用热跟踪,鼠标悬念节点项加下划线,鼠标样式改为小手
TVS_CHECKBOXES		具有复选框样式
TVS_INFOTIP			具有鼠标悬念显示工具提示框
TVS_NOTOOLTIPS 		禁用工具提示框
TVS_SINGLEEXPAND	展开单个节点,其他节点自动收缩
TVS_FULLROWSELECT	全行选择,突出显示整个行

3.控件常用消息

消息ID消息说明WPARAMLPARAM返回值
TVM_INSERTITEM插入新节点0TVINSERTSTRUCT结体指针HTREEITEM
TVM_GETITEM获得节点结构数据HTREEITEMTVITEM结构体指针BOOL
TVM_GETNEXTITEM获得指定节点相关联的节点结构TVGN_CARE,等相关联的节点标记HTREEITEM,指定的节点句柄,如是TVGN_ROOT,TVGN_CARE等为0HTREEITEM或者NULL
TVM_EXPAND展开/折叠节点TVE_COLLAPSE,TVE_EXPANDHTREEITEMBOOL
TVM_SETBKCOLOR设置控件背景色0COLORREFCOLORREF
TVM_SETTEXTCOLOR设置文本颜色0COLORREFCOLORREF
TVM_SEECTITEM选中指定节点当前节点标记TVGN_CARET指定项可见TVGN_FIRSTVISIBLEHTREEITEMBOOL

3.1TVM_INSERTITEM

inline HTREEITEM TreeCtrl_InsertItem(HWND hTree, LPCTSTR lpText, HTREEITEM hParent, int nImage, int nSelImage)
{
	TVINSERTSTRUCT tvInItem; 
	tvInItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; 
	tvInItem.item.iImage = nImage; 
	tvInItem.item.iSelectedImage = nSelImage; 
	tvInItem.item.pszText = (LPWSTR)lpText;
	tvInItem.hParent = hParent;
	tvInItem.hInsertAfter = TVI_LAST;
	return (HTREEITEM)SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&tvInItem);
}

3.2.TVM_GETITEM

该消息可获得节点文本,节点附加数据,图像索引

3.2.1 获得节点文本

	TCHAR szString[100]={0};
	
	TVITEM item = { 0 };
	item.hItem = hItem;
	item.mask = TVIF_TEXT;
	item.pszText = szString;
	item.cchTextMax = 100;
	SendMessage(hTree, TVM_GETITEM, 0, LPARAM(&item));
	

3.2.2获得节点附加数据

	TCHAR *pData=nullptr;
	
	TVITEM item = { 0 };
	item.hItem = hItem;
	item.mask = TVIF_PARAM;
	SendMessage(hTree, TVM_GETITEM, 0, LPARAM(&item));
	pData=(TCHAR*)item.lParam;

3.3.3获得节点图标的索引

	int nImage,nSelImage;
	
	TVITEM item = { 0 };
	item.hItem = hItem;
	item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	BOOL bRet = (BOOL)::SendMessage(hTree, TVM_GETITEM, 0, LPARAM(&item));
	if (bRet)
	{
		nImage = item.iImage;
		nSelImage = item.iSelectedImage;
	}

3.3TVM_GETNEXTITEM

该消息的标记有:
TVGN_CARET 当前选中的节点
TVGN_ROOT 第一个根节点
TVGN_CHILD 第一个子节点
TVGN_NEXT 下一个相邻的节点
TVGN_PARENT 父节点

3.3.1 获得当前选中节点

HTREEITEM hSelItem=(HTREEITEM)SendMessage(hTree,TVM_GETNEXTITEM,TVGN_CARET,0);

3.3.2获得第一个根节点

HTREEITEM hRoot=(HTREEITEM)SendMessage(hTree,TVM_GETNEXTITEM,TVGN_ROOT,0);

3.3.3获得当前节点的第一个子节点

HTREEITEM hChild=(HTREEITEM)SendMessage(hTree,TVM_GETNEXTITEM,TVGN_CHILD,(LPARAM)hItem);

3.3.4获得当前节点的下一个节点

HTREEITEM hNext=(HTREEITEM)SendMessage(hTree,TVM_GETNEXTITEM,TVGN_NEXT,(LPARAM)hItem);

3.3.5获得当前节点的父节点

HTREEITEM hParent=(HTREEITEM)SendMessage(hTree,TVM_GETNEXTITEM,TVGN_PARENT,(LPARAM)hItem);

4.通知消息

树控件是通过WM_NOTIFY向父窗口发送消息的

消息ID消息说明LPARAM
NM_DBLICK鼠标双击节点LPNMHDR
NM_KILLFOCUS失去焦点消息LPNMHDR
TVN_DELETEITEM删除节点项消息LPNMTREEVIEW
TVN_GETINFOTIP鼠标悬浮显示提示信息,要有TVS_INFOTIP样式LPNMTVGETINFOTIP
TVN_KEYDOWN键盘按下消息LPNMTVKEYDOWN
TVN_SELCHANGED选中项发生改变消息LPNMTREEVIEW

4.1捕获TVN_GETINFOTIP消息

1.要想捕获TVN_GETINFOTIP消息,树控件必须要有TVS_INFOTIP样式
2.在父窗口的WM_NOTIFY消息中捕获

	LPNMTVGETINFOTIP lpTVtoip=(LPNMTVGETINFOTIP)lParam;
	TACH szText[100]={0};
	
	HTREEITEM hSel = lpTVtoip->hItem;
	TreeView_GetItemText(hTree,szText,100);
	lstrcpy(lpTVtoip->pszText,szText);
	

5.实例代码

//创建树形控件
HWND hTree = CreateWindowEx(WS_EX_CLIENTEDGE, 
				TEXT("SysTreeView32"), 
				nullptr,
				WS_CHILD | WS_VISIBLE | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,
				10, 10, 200, 300, 
				hWnd, 
				0, 
				hInstance, 
				0);

//插入新的节点项		
HTREEITEM hRoot = TreeCtrl_InsertItem(hTree, TEXT("Root1"), TVI_ROOT, 0, 0);
HTREEITEM hRoot1 = TreeCtrl_InsertItem(hTree, TEXT("Root2"), hRoot, 0, 0);
HTREEITEM hRoot2 = TreeCtrl_InsertItem(hTree, TEXT("Root3"), TVI_ROOT, 0, 0);

//展开指定节点
TreeCtrl_Expand(hTree, hRoot, TVE_EXPAND);

6.效果示意图

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值