treeview
treeview
一般由dialog
绘制- 在程序中我们只要配置
treeview
的一些额外属性即可
数据类型介绍
HWND hTreeCtrl = NULL; treeview的句柄
HTREEITEM 节点id,每个节点都有自己的id
TVITEM item; 用户描述节点的结构体,用于获取属性
TVINSERTSTRUCT 描述增加的节点的结构体
配置treeview
- 在本函数中我们锁定了
treeview的句柄
并且保存到全局变量 - 物品们对treeview 的显示进行额外的配置
HTREEITEM treeview_create()
{
//锁定 treview 的 句柄
//HWND hTreeCtrl = GetDlgItem(hDlg, IDC_FILE_TREE);
hTreeCtrl = GetDlgItem(hDlg, IDC_FILE_TREE);
//配置 + 号 以及 虚线链接,这样层次感更加
SetWindowLong(hTreeCtrl, GWL_STYLE, GetWindowLong(hTreeCtrl, GWL_STYLE) | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);
//设置图像列表,用来放在trewviewer记录左边的图像
//我们这里直接获取系统内置的 图像列表
SHFILEINFO sfi;
HIMAGELIST hSmallIconLst;
hSmallIconLst = (HIMAGELIST)SHGetFileInfo(_T(""), 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
SendMessage(hTreeCtrl, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hSmallIconLst);//应用图像列表
return HTREEITEM();
}
增加 节点
- 我们必须明确增加的节点增加到哪里
- 节点增加会返回
节点的 id
HTREEITEM treeview_add_node(HTREEITEM hParent, TCHAR * name)
{
TVINSERTSTRUCT tvInsert;
tvInsert.hParent = hParent;//父节点
tvInsert.hInsertAfter = NULL;//插入到列表的哪个位置位置
tvInsert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;//说明我准备设置哪些属性
tvInsert.item.iImage = 3;//设置未选中状态的图标
tvInsert.item.iSelectedImage = 3;//设置选中状态的图标
tvInsert.item.pszText = name;//设置显示的名称
//在树中增加节点
HTREEITEM hCon = (HTREEITEM)::SendDlgItemMessage(hDlg, IDC_FILE_TREE, TVM_INSERTITEM, 0, (LPARAM)&tvInsert);
return hCon;
}
HTREEITEM 详解
获取根节点信息
TCHAR szBuf[256];
TVITEM item;//临时变量用来保存用户相中的节点
item.hItem = treeLparam->itemNew.hItem;//获取节点唯一标识符
item.mask = TVIF_TEXT; //设置tvm的有效选项----TVIF_TEXT=名称地址+名称长度
item.pszText = szBuf;//设置节点名称使用的地址
item.cchTextMax = 256 * sizeof(TCHAR);//设置节点长度
//获取根节点属性
HTREEITEM root_node=TreeView_GetRoot(hTreeCtrl);//获取根结点id
item.hItem = root_node;//配置属性获取
TreeView_GetItem(hTreeCtrl, &item);//获取属性
//获取第一个子节点
HTREEITEM get_node =TreeView_GetChild(hTreeCtrl, root_node);//获取第一个子节点的id
item.hItem = get_node;//指定我们要获取的节点的id
TreeView_GetItem(hTreeCtrl, &item);//节点属性
OutputDebugStringA("item:");
OutputDebugString(item.pszText);
OutputDebugStringA("\r\n");
//获取所有子节点
{
HTREEITEM get_node = NULL;
//TreeView_GetItem(hTreeCtrl, &item);//获取当前结点
get_node = TreeView_GetChild(hTreeCtrl, treeLparam->itemNew.hItem);
while (get_node!=NULL) {
item.hItem = get_node;
TreeView_GetItem(hTreeCtrl, &item);
OutputDebugStringA("item:");
OutputDebugString(item.pszText);
OutputDebugStringA("\r\n");
get_node=TreeView_GetNextItem(hTreeCtrl, get_node, TVGN_NEXT);
}
}