mfc — получить значение lparam из переполнения стека htreeitem

Я создал диалог с древовидным элементом управления, который выбирает данные в элемент управления списком при щелчке на любом конкретном узле древовидного элемента управления. Вот как я пытался вставить узлы.

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», а данные выбираются по пути, указанному в параметре «lparam» в методе insertitem HTREEITEM.

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 всех дескрипторов дерева последовательно, итерируя по нему, чтобы я мог искать конкретный текст в дереве.
Поэтому, не щелкая ни на каком узле дерева, есть ли возможность получить значение lparam дескриптора дерева (HTREEITEM)

0

Решение

Вы можете перебирать дерево из корня с помощью TreeView_GetChild, где дескриптор является дескриптором дерева. Чтобы получить дескриптор, вызовите TreeView_GetItem.

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

TreeView_GetItem(handle_, &item);
CString* text = (CString*)item.lParam;
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,

0

По вопросам рекламы [email protected]