2016-08-25 1 views
0

У меня есть требование конвертировать проект из VB в C++.Добавление элемента в CTreectrl C++

В VB есть управление деревьями. Для добавления элементов в элемент управления дерева «Добавить» (сбор узлов) был использован, который содержит параметр «ключ», и один и тот же ключ можно получить при щелчке по этому конкретному элементу.

Есть ли такое положение в функции CTreeCtrl InsertItem с использованием структуры TVITEM или TVITEMEX, где мы можем добавить ключ к каждому элементу элемента управления деревом и вернуть его при нажатии на него?

+0

Возможный дубликат [TVITEM LPARAM для хранения строки] (http://stackoverflow.com/questions/13285126/tvitem-lparam-to-store-string) –

+0

Спасибо. Как мне это сделать при извлечении. Мне нужно, когда элемент щелкнут, и я использую событие OnTvnSelchangedTree() для получения данных. Я пробовал делать LPARAM lp = pNMTreeView-> itemNew.lParam; но он не возвращает то, что я сохранил. –

+0

[CTreeCtrl :: GetSelectedItem()] (https://msdn.microsoft.com/en-us/library/8bkz91b4.aspx) предоставляет выбранный вами элемент. Но вы спрашивали о «добавлении товара в CTreectrl» *! –

ответ

1

Чтобы создать корневой элемент:

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. Затем сделайте то, что вы намереваетесь с указателем, который у вас есть.

+2

Это не будет работать, если пользователь изменяет элемент с помощью клавиатуры. Просто используйте 'ON_NOTIFY (TVN_SELCHANGED, IDC_TREE1, OnTreeSelChanged) ...' –

+0

@BarmakShemirani: Я только что поддержал ваш комментарий, и я изменю свой ответ в соответствии. – sergiol

+0

Могу ли я узнать, что такое CElement? –