У меня есть список файлов дерева, которые упали на него.
Когда я создаю новый элемент древовидной структуры, я хотел бы сохранить адрес файла в виде строки в этом элементе и позднее извлечь его для различных гнусных целей.
Глядя на Структура ТВИТЕМ в документах Microsoft, видимо 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.
Это правильный способ сделать то, что я пытаюсь сделать? Если так, что происходит?
Конечно, найдите время, чтобы опубликовать вопрос после долгого времени, пытаясь выяснить его, и ответ появится в считанные секунды.
Оказывается, маска TVITEM должна включать TVIF_PARAM, аналогично этот вопрос.
Если я изменю приведенный выше код на:
tvi.mask = TVIF_TEXT | TVIF_PARAM;
это работает как ожидалось.
Я все еще не уверен, является ли это рекомендуемым использованием для LPARAM, все же.
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;
Я не проверяю этот код, но он должен работать. Удачного кодирования 🙂