Win32 TreeCtrl TVN_ENDLABELEDIT выделение памяти - PullRequest
1 голос
/ 19 сентября 2008

У меня есть Win32 TreeCtrl, где пользователь может переименовать метки дерева. Я обрабатываю сообщение TVN_ENDLABELEDIT, чтобы сделать это.

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

Для этого я изменяю элемент pszText структуры TVITEM, которую я получил во время TVN_ENDLABELEDIT. Здесь я делаю замену указателя, поскольку исходная память может быть слишком маленькой, чтобы выполнить простую операцию, похожую на strcpy.

Однако я не знаю, как освободить оригинальный член pszText. В основном потому, что неизвестно, было ли это создано с помощью malloc () или new ... поэтому я не могу вызвать соответствующий освобождение. Очевидно, что Win32 не будет вызывать Deloclocator для старого pszText, потому что указатель был заменен. Так что, если я не освобожу, произойдет утечка памяти.

Есть идеи, как Win32 распределяет эти структуры и как правильно обращаться с вышеуказанной ситуацией?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2008

Если вы не используете LPSTR_TEXTCALLBACK, элемент управления в виде дерева отвечает за выделение памяти, а не вашего кода, поэтому вам не следует изменять значение указателя pszText.

Чтобы изменить текст элемента в обработчике TVN_ENDLABELEDIT, вы можете использовать TreeView_SetItem, а затем вернуть 0 из обработчика.

0 голосов
/ 20 сентября 2008

Вы не хотите напрямую редактировать текст в структуре TVITEM, результаты не определены. Вместо этого используйте сообщение TVM_SETITEM или, что то же самое, используйте макрос TreeView_SetItem (), определенный в windowsx.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...