treeview

  1. treeview一般由dialog绘制
  2. 在程序中我们只要配置treeview的一些额外属性即可

数据类型介绍

HWND hTreeCtrl = NULL;  treeview的句柄
HTREEITEM               节点id,每个节点都有自己的id
TVITEM item;            用户描述节点的结构体,用于获取属性
TVINSERTSTRUCT          描述增加的节点的结构体

配置treeview

  1. 在本函数中我们锁定了 treeview的句柄并且保存到全局变量
  2. 物品们对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();
}

增加 节点

  1. 我们必须明确增加的节点增加到哪里
  2. 节点增加会返回节点的 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);
    }
}
Last modification:October 26, 2018
如果觉得我的文章对你有用,请随意赞赏