0

我创建了一个带有树控件的对话框,当单击树控件的任何特定节点时,它会将数据提取到列表控件中。这就是我尝试插入节点的方式。

CString *sCommonAppkey = new CString(_szApp + sIsPath);

HTREEITEM hrCommon = m_cTreeCtrl.InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, _T("Common"), icoPlanit, icoPlanit, 0, 0, (LPARAM)(LPCTSTR)sCommonAppkey, NULL, NULL);

当单击一个节点时,它将被定向到事件处理程序“OnTvnSelchangedExample”,并且数据是从 HTREEITEM 的 insertitem 方法中的“lparam”参数中指定的路径获取的。

void **CExample**::OnTvnSelchangedExample(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

LPARAM lp = pNMTreeView->itemNew.lParam;

    CString *sTempKey = (CString *)lp;
    CString path = sTempKey->GetBuffer();
}

我只能在事件处理程序中访问 lparam 值。

现在我想为整个树的数据实现搜索功能。

所以我需要所有 Tree 句柄的 lparam 值,通过迭代它,以便我可以搜索树中的特定文本。所以不点击树的任何节点,有没有可能得到树句柄(HTREEITEM)的lparam值

4

2 回答 2

0

使用递归很容易实现树遍历:

void CMyTreeCtrl::Iterate(HTREEITEM hItem)
{
    if (hItem)
    {
        // Use the tree node corresponding to hItem
        // .....
        // End of using hItem
        hItem = GetNextItem(hItem, TVGN_CHILD);
        while (hItem)
        {
            Iterate(hItem);
            hItem = GetNextItem(hItem, TVGN_NEXT);
        }
    }
    else
    {
        HTREEITEM hItem = GetNextItem(NULL, TVGN_ROOT);
        while (hItem)
        {
            Iterate(hItem);
            hItem = GetNextItem(hItem, TVGN_NEXT);
        }
    }
}

如果要获取项目数据,只需调用GetItemData(hItem). 它返回DWORD_PTR。因此,在您的情况下,您需要将其转换为CString*. 而已。

重要提示:在此示例CMyTreeCtrl中源自CTreeCtrl.

于 2016-11-03T16:30:06.130 回答
0

您可以使用 TreeView_GetChild 从根遍历树,句柄就是树句柄。要获取句柄,请调用 TreeView_GetItem。

TVITEMEX item;
item.mask = TVIF_PARAM;
item.hItem = hrCommon;

TreeView_GetItem(handle_, &item);
CString* text = (CString*)item.lParam;
于 2016-11-03T15:37:01.197 回答