Чтобы создать корневой элемент:
TV_INSERTSTRUCT tvInsertStruct;
tvInsertStruct.hParent=NULL;
tvInsertStruct.hInsertAfter=TVI_LAST;
tvInsertStruct.item.pszText=_T("ROOT");
tvInsertStruct.item.mask=TVIF_TEXT;
const HTREEITEM hRootItem= m_tree.InsertItem(&tvInsertStruct);
Для вставки подпункты висит на корню:
for(int i=0; i<SomeCollection.GetCount(); i++)
{
const CElement* pElement= SomeCollection.GetAt(i);
ASSERT(pElement);
CString Name = pElement->GetName();
tvInsertStruct.hParent = hRootItem;
tvInsertStruct.hInsertAfter = TVI_LAST;
const LPTSTR cutJobNameTemp = Name.GetBuffer(0);
tvInsertStruct.item.pszText = cutJobNameTemp;
tvInsertStruct.item.mask = TVIF_TEXT;
HTREEITEM hItem = m_tree.InsertItem(&tvInsertStruct);
ASSERT(hItem);
tree.SetItemData(hItem, (DWORD_PTR)pElement);
}
Строка кода, которая отвечает на ваш вопрос SetItemData
: с ним можно непосредственно связать дескриптор узла дерева с адресом памяти.111
Для просмотра всех имеющихся узлов нажмите только что добавьте:
ExpandTreeCtrl(m_tree);
Примечание:Я знаю, что следующий не самый чистый подход для обработки выбора элемента на дереве, поэтому я заменил его более надлежащим образом, что также обрабатывает клавиатуру
для того, чтобы получить точку входа для вашего приложения, чтобы реагировать на щелчки на дереве, вы можете добавить в родительском диалоге (или управления) 's карты сообщения
ON_NOTIFY(NM_CLICK, IDC_TREE, OnNMClickTree)
и осуществлять свою функцию обработки
void CMyDialog::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
UINT flags;
CPoint point;
GetCursorPos(&point);
*pResult= 0;
CTreeCtrl* pTree= dynamic_cast <CTreeCtrl*> (this->GetDlgItem(pNMHDR->idFrom));
if(pTree)
{
pTree->ScreenToClient(&point);
HTREEITEM hItem = pTree->HitTest(point, &flags);
if((flags & TVHT_ONITEMINDENT) || (flags & TVHT_ONITEMBUTTON)) //do nothing when clicking on the [+]expand/[-]collapse of the tree
return;
if(!hItem)
return;
// If you want to get item text:
CString sText= pTree->GetItemText(hItem);
//To get your element:
CElement* pElement = (CElement*)pTree->GetItemData(hItem);
}
}
Чтобы получить точку входа для вашего приложения, чтобы реагировать на изменение выбранного элемента на дереве, вы можете добавить в родительском окне (или управлении) 'ы карты сообщения
ON_NOTIFY(TVN_SELCHANGED,IDC_TREE, OnTreeCtrlSelChanged)
и осуществлять его функции обработки
void CMyDialog::OnTreeCtrlSelChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
if(!hItem)
return;
// If you want to get item text:
CString sText= m_tree.GetItemText(hItem);
//To get your element:
CElement* pElement = (CElement*)m_tree.GetItemData(hItem);
}
линия т hat теперь разыменовывает доступ к данным CElement
, связанным с узлом дерева, - GetItemData
. Затем сделайте то, что вы намереваетесь с указателем, который у вас есть.
Возможный дубликат [TVITEM LPARAM для хранения строки] (http://stackoverflow.com/questions/13285126/tvitem-lparam-to-store-string) –
Спасибо. Как мне это сделать при извлечении. Мне нужно, когда элемент щелкнут, и я использую событие OnTvnSelchangedTree() для получения данных. Я пробовал делать LPARAM lp = pNMTreeView-> itemNew.lParam; но он не возвращает то, что я сохранил. –
[CTreeCtrl :: GetSelectedItem()] (https://msdn.microsoft.com/en-us/library/8bkz91b4.aspx) предоставляет выбранный вами элемент. Но вы спрашивали о «добавлении товара в CTreectrl» *! –