从 htreeitem C++ 中获取 lparam 值
get lparam value form the htreeitem c++
我创建了一个带有树控件的对话框,当单击树控件的任何特定节点时,它会将数据提取到列表控件中。这就是我尝试插入节点的方式。
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 值。
现在我想为整棵树的数据实现搜索功能。
所以我需要通过遍历顺序遍历所有树句柄的 lparam 值,以便我可以在树中搜索特定文本。
因此,无需单击树的任何节点,是否有可能获取树句柄(HTREEITEM)
的 lparam 值
您可以使用 TreeView_GetChild 从根开始遍历树,句柄就是树句柄。要获取句柄,请调用 TreeView_GetItem.
TVITEMEX item;
item.mask = TVIF_PARAM;
item.hItem = hrCommon;
TreeView_GetItem(handle_, &item);
CString* text = (CString*)item.lParam;
树遍历使用递归很容易实现:
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)
。它returnsDWORD_PTR
。因此,在您的情况下,您需要将其转换为 CString*
。就是这样。
重要提示:在此示例中,CMyTreeCtrl
派生自 CTreeCtrl
。
我创建了一个带有树控件的对话框,当单击树控件的任何特定节点时,它会将数据提取到列表控件中。这就是我尝试插入节点的方式。
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 值。
现在我想为整棵树的数据实现搜索功能。
所以我需要通过遍历顺序遍历所有树句柄的 lparam 值,以便我可以在树中搜索特定文本。 因此,无需单击树的任何节点,是否有可能获取树句柄(HTREEITEM)
的 lparam 值您可以使用 TreeView_GetChild 从根开始遍历树,句柄就是树句柄。要获取句柄,请调用 TreeView_GetItem.
TVITEMEX item;
item.mask = TVIF_PARAM;
item.hItem = hrCommon;
TreeView_GetItem(handle_, &item);
CString* text = (CString*)item.lParam;
树遍历使用递归很容易实现:
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)
。它returnsDWORD_PTR
。因此,在您的情况下,您需要将其转换为 CString*
。就是这样。
重要提示:在此示例中,CMyTreeCtrl
派生自 CTreeCtrl
。