2016-11-03 3 views
0

Я создал диалог с элементом управления деревом, который извлекает данные в элемент управления списком при нажатии на любой конкретный узел treecontrol. Вот как я попытался вставить узлы.получить значение lparam из 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» и данные выбираются из пути, указанного в параметре «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

им жаль, если я прошу вас глупый вопрос. Но TreeView_GetItem() принимает дескриптор HWND и как я могу передать в нем дескриптор дерева – user3655089

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.