树形控件类名: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 | 消息说明 | WPARAM | LPARAM | 返回值 |
---|---|---|---|---|
TVM_INSERTITEM | 插入新节点 | 0 | TVINSERTSTRUCT结体指针 | HTREEITEM |
TVM_GETITEM | 获得节点结构数据 | HTREEITEM | TVITEM结构体指针 | BOOL |
TVM_GETNEXTITEM | 获得指定节点相关联的节点结构 | TVGN_CARE ,等相关联的节点标记 | HTREEITEM,指定的节点句柄,如是TVGN_ROOT ,TVGN_CARE 等为0 | HTREEITEM或者NULL |
TVM_EXPAND | 展开/折叠节点 | TVE_COLLAPSE ,TVE_EXPAND | HTREEITEM | BOOL |
TVM_SETBKCOLOR | 设置控件背景色 | 0 | COLORREF | COLORREF |
TVM_SETTEXTCOLOR | 设置文本颜色 | 0 | COLORREF | COLORREF |
TVM_SEECTITEM | 选中指定节点 | 当前节点标记TVGN_CARET 指定项可见TVGN_FIRSTVISIBLE | HTREEITEM | BOOL |
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);