将项添加到CTreectrl C ++

时间:2016-08-25 11:27:15

标签: c++ mfc

我需要将项目从VB转换为C ++。

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

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

1 个答案:

答案 0 :(得分: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);

注意: 我知道以下不是最简洁的方法来处理树上项目的选择,所以我用更合适的方式替换它也处理键盘

要获得应用程序的响应点以响应树上的Clicks,您可以添加其父对话框(或控件)的消息映射

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

现在解除引用以访问与树节点关联的CElement数据的行是GetItemData。然后用你得到的指针做你想要的。