我有一个树视图列出了丢弃的文件。
当我制作一个新的树视图项目时,我想将该文件的地址存储为该项目中的字符串,并在以后的各个时间点检索它。
查看Microsoft文档中的TVITEM structure,显然LPARAM
是存储值的地方:
lParam的
Type: LPARAM A value to associate with the item.
所以,我已经完成了这一步:
TVITEM tvi;
tvi.mask = TVIF_TEXT;
tvi.pszText = const_cast<char *> (str0.c_str());
tvi.cchTextMax = sizeof(tvi.pszText);
tvi.lParam = (LPARAM) foo; // SETTING LPARAM HERE, foo IS A const char *
TVINSERTSTRUCT tvis;
tvis.item = tvi;
tvis.hInsertAfter = 0;
tvis.hParent = hti0;
// Send message to update tree, and return tree item.
return TreeView_InsertItem(tvw_filelist_, &tvis);
然后,当我试图找回我的价值时......
HTREEITEM htiSel = TreeView_GetSelection(tvw_filelist_);
TVITEM tvItem;
tvItem.hItem = htiSel;
TreeView_GetItem(tvw_filelist_, &tvItem);
const char * info = (const char *) tvItem.lParam;
MessageBox(NULL, info, "Alert", MB_OK);
......我只是得到了垃圾,表明我的指针超出范围或正在小睡或其他东西。该指针的大小始终为4。
这是我正在尝试做的事情的正确方法吗?如果是这样,那是怎么回事?
答案 0 :(得分:2)
当然,花点时间在很长一段时间后发布一个问题来解决问题,答案会在几秒钟内显示出来。
原来,TVITEM模板需要包含TVIF_PARAM,类似于this question。
如果我将上述代码更改为:
tvi.mask = TVIF_TEXT | TVIF_PARAM;
它按预期工作。
我仍然不确定这是否是LPARAM的推荐用途。
答案 1 :(得分:2)
struct CustomTreeData
{
LPSTR str; // or even std::string to forget about memory managment
// TODO: any other data you need
};
...
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_PARAM;
CustomTreeData* myDataPtr = new CustomTreeData; // the memory should be free later
myDataPtr->str = stringWhatIWant; // And don't forget to alloc memory for str!
tvi.lParam = (LPARAM) myDataPtr;
我不检查此代码,但应该可以使用。快乐的编码:)