使用CTreeCtrl设置/获取lParam值

时间:2014-02-02 16:14:13

标签: pointers memory mfc treeview lparam

我正在使用CTreeCtrl来显示一些数据。对于树中的每个条目,我都有一些关联数据,我将其保存在结构中。我通过将指针放在树中每个条目的lParam值中的struct来保存这个数据。

这是我在树上的添加条目代码:

void CClassView::AddElementToTree(Element* _pElement, HTREEITEM _hRoot)
{
    HTREEITEM hBranch;

    TVINSERTSTRUCT tvInsert;
    ZeroMemory(&tvInsert, sizeof(tvInsert));
    tvInsert.hParent = _hRoot;
    tvInsert.hInsertAfter = NULL;
    tvInsert.item.mask = TVIF_TEXT;

    WCHAR szText[64] = {'\0'};
    tvInsert.item.pszText = szText;

    for(std::vector<Element*>::iterator i = _pElement->pChildren.begin(); i != _pElement->pChildren.end(); ++i)
    {
        wcscpy_s(szText, (*i)->GetName().c_str());
        tvInsert.item.lParam = (LPARAM)(*i);

        hBranch = m_wndClassView.InsertItem(&tvInsert);
        AddElementToTree(*i, hBranch);
    }
}

本质上,此函数以递归方式向树中添加元素及其子元素。 _pElement我向外传递。这是我班级的成员变量,所以我知道除非程序结束,否则它不会被销毁。

当用户在树视图中选择一个条目时,我处理了selchanged消息:

void CLayerTree::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

    Element* pElement = (Element*)pNMTreeView->itemNew.lParam;

    *pResult = 0;
}

pElement始终为NULL。我调试了程序,似乎lParam也是零。

我做错了吗?我知道我的struct的内存还没有被释放。我正在将条目添加到树中,这有什么不对吗?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

必须在面具中设置TVIF_PARAM!