Member 12677926 Ответов: 1

Как мне получить параметр lparam значение метод ctreectrl МФЦ


У меня есть элемент управления деревом, где каждый узел связан со значением LPARAM. При определенном событии нажатия кнопки я хочу получить значение LPARAM. Приведенный ниже код выполняется более одного раза. поэтому, когда я пытаюсь получить значение LPARAM для начальных значений, это мусорное значение.

Что я уже пробовал:

strTemp.Format(_T("%s %f %s %f"), _T("Length: "), fLength, _T("-->"), fCXLength);
m_strParamval = _T("LENG") + CXString::Format(_T("%d"), m_nMatID);
LPCTSTR pszParamVal = m_strParamval;

HTREEITEM hMatChild = m_cTreeCtrl.InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM,strTemp, 0, 0, 0, 0, (LPARAM)pszParamVal, m_hMatNode, TVI_LAST);




это код для получения:

TVITEMEX item1;
item1.mask = TVIF_PARAM;
item1.hItem = m_hMatTest;


TreeView_GetItem(m_cTreeCtrl, &item1);
CString strPath1 = (LPCTSTR)item1.lParam;

1 Ответов

Рейтинг:
8

Jochen Arndt

Это никогда не будет работать так, как ожидалось.

Вы храните строку в m_strParamval Эта строка будет обновляться всякий раз, когда вы вставляете новый элемент. Таким образом, вы всегда получите строку для последнего добавленного элемента.

Но что еще более важно, LPARAM значения могут больше не указывать на допустимую строку. m_strParamval иметь тип CString который может выделить новую память при назначении новой строки, которая больше существующего содержимого. Затем указатель вернулся CString::GetString() (который используется при назначении CString К LPCTSTR) больше не действует.

Если вы хотите хранить отдельные строки для каждого элемента, вы должны использовать выделенную память для каждого элемента и освободить ее, когда элементы будут удалены и дерево будет уничтожено.
Пример:

CString strParamval = _T("LENG") + CXString::Format(_T("%d"), m_nMatID);
TCHAR *pszParamVal = new TCHAR[strParamval.GetLength()];
_tcscpy(pszParamVal, strParamval.GetString());
Опять же: при этом не забудьте удалить память при удалении элементов или уничтожении элемента управления деревом.


Member 12677926

это локальный указатель вправо. так где же именно его следует удалить??

Jochen Arndt

Вы должны удалить память при использовании моего решения:

TCHAR *pszParam = (TCHAR*)item.lParam;
delete [] pszParam;

Вышеописанное должно быть вызвано при удалении элемента (если у вас есть такая функция) и для всех элементов при удалении элемента управления дерева (при закрытии окна, содержащего элемент управления, или внутри деструктора элемента управления дерева, если вы произвели свой собственный класс).

Ваш m_strParamval после этого он больше не используется и может быть удален.