1

ユーザーがツリーラベルの名前を変更できるWin32TreeCtrlがあります。これを行うために、TVN_ENDLABELEDITメッセージを処理します。

場合によっては、ユーザーが入力したテキストを変更する必要があります。基本的に、ユーザーは編集中に短い名前を入力できますが、それを長いテキストに置き換えたいと思います。

これを行うには、TVN_ENDLABELEDIT中に受け取ったTVITEM構造体のpszTextメンバーを変更します。元のメモリが小さすぎて単純なstrcpyのような操作を実行できない可能性があるため、ここでポインタを置き換えます。

ただし、元のpszTextメンバーの割り当てを解除する方法がわかりません。基本的に、それがmalloc()で作成されたのか、newで作成されたのかが不明であるため、適切なデアロケーターを呼び出すことができません。明らかに、ポインタが置き換えられているため、Win32は古いpszTextのデアロケータを呼び出しません。したがって、割り当てを解除しないと、メモリリークが発生します。

Win32がこれらの構造体をどのように割り当てるか、および上記の状況を処理する適切な方法は何ですか?

4

2 に答える 2

2

を使用している場合を除き、ツリービューコントロールはコードではなくメモリの割り当てを担当するため、ポインタLPSTR_TEXTCALLBACKの値を変更しないでください。pszText

ハンドラー内のアイテムのテキストを変更するにはTVN_ENDLABELEDIT、を使用TreeView_SetItemして、ハンドラーから0を返します。

于 2008-09-19T10:57:40.163 に答える
0

TVITEM構造体のテキストを直接編集したくない場合は、結果は未定義です。代わりに、TVM_SETITEMメッセージを使用するか、同等に、windowsx.hで定義されているTreeView_SetItem()マクロを使用してください。

于 2008-09-19T20:27:31.237 に答える