2008-09-19 25 views
1

J'ai un Win32 TreeCtrl où l'utilisateur peut renommer les étiquettes d'arbres. Je traite le message TVN_ENDLABELEDIT pour ce faire.Win32 TreeCtrl allocation de mémoire TVN_ENDLABELEDIT

Dans certains cas, je dois modifier le texte saisi par l'utilisateur. Fondamentalement, l'utilisateur peut entrer un nom court pendant l'édition et je veux le remplacer par un texte plus long. Pour cela, je change le membre pszText de la structure TVITEM reçue lors de TVN_ENDLABELEDIT. Je remplace un pointeur ici, car la mémoire d'origine peut être trop petite pour faire une simple opération de type strcpy.

Toutefois, je ne sais pas comment libérer le membre pszText d'origine. Fondamentalement parce que c'est inconnu si cela a été créé avec malloc() ou nouveau ... donc je ne peux pas appeler le deallocator approprié. Évidemment Win32 n'appelera pas le deallocator pour l'ancien pszText parce que le pointeur a été remplacé. Donc, si je ne libère pas, il y aura une fuite de mémoire.

Une idée de comment Win32 allouer ces structures et quelle est la bonne façon de gérer la situation ci-dessus?

Répondre

2

Sauf si vous utilisez LPSTR_TEXTCALLBACK, le contrôle Tree-View est responsable de l'allocation de la mémoire, pas de votre code, vous ne devez donc pas modifier la valeur du pointeur pszText.

Pour modifier le texte de l'élément dans votre gestionnaire TVN_ENDLABELEDIT, vous pouvez utiliser TreeView_SetItem, puis renvoyer 0 à partir du gestionnaire.

0

Vous ne voulez pas éditer directement le texte dans la structure TVITEM, les résultats ne sont pas définis. À la place, utilisez le message TVM_SETITEM ou, de manière équivalente, utilisez la macro TreeView_SetItem() définie dans windowsx.h.