将项目添加到CTreectrl C++

问题描述:

我有一个将项目从VB转换为C++的需求。将项目添加到CTreectrl C++

VB中有树控件。 用于添加项目到树控件“添加”方法(节点集合) 已被使用,其中包含一个名为“key”的参数,并且可以通过单击该特定项目来检索相同的密钥。

在使用TVITEM或TVITEMEX结构的CTreeCtrl InsertItem函数中是否有任何这样的规定,我们可以在树控件的每个项目上添加一个键并在点击它时将其返回?

+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”*! –

要创建根项目:

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); 

注:我知道下面是不是要处理的树中的项目的选择最干净的方法,所以我也处理键盘

更合适的方式取代了它为了得到一个入口点的应用程序响应点击次数上树,你可以在它的父对话框(或控制)的消息映射

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); 
} 

的T线帽子现在取消引用以访问与树节点关联的CElement数据为GetItemData。然后用你得到的指针做你想要的。

+2

如果用户使用键盘更改项目,这将不起作用。只需使用'ON_NOTIFY(TVN_SELCHANGED,IDC_TREE1,OnTreeSelChanged)...' –

+0

@BarmakShemirani:我刚刚提出了你的评论,我会按照改变我的答案。 – sergiol

+0

我可以知道CElement是什么? –