我正在使用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的内存还没有被释放。我正在将条目添加到树中,这有什么不对吗?
任何帮助都将不胜感激。
答案 0 :(得分:4)
必须在面具中设置TVIF_PARAM!