CListBox::SetItemData を使用して、所有者が作成した CListBox 派生クラスのデータへのポインターを格納します。リストボックス自体がそれを追跡し、不要になったときにメモリを解放したいと考えています。
そのためには、アイテムが削除されるたびに通知を受ける必要があります (LB_RESETCONTENT およびアイテムが削除される可能性のある他のすべてのケースを含む)。それを達成するために処理できるイベントはありますか?
とにかくリストボックスをすでにサブクラス化しているので、「適切な」設計は、データ管理機能をリストボックスに追加することです。これにより、アイテムがいつ削除されるかがわかり、必要に応じてデータを削除できます。つまり、リストが人を追跡しているとすると、AddPerson(Person p)メソッドとRemovePerson(Person p)メソッドをクラスに追加します。RemovePersonを実装すると、リストからそれぞれのエントリが削除され、それに関連するすべてのデータが削除されます。したがって、CListBox :: DeleteStringを使用して削除するのではなく、自分で実装する高レベルのAPIを使用してください。
いいえ。ListBox は、ユーザーが行ったことに対する通知のみを生成します。ユーザーは、独自のコードでのみ実行できるリスト ボックスを削除、追加、または空にすることはできません。したがって、ここでの哲学は、コントロールはユーザーが既に知っていることをユーザーに伝える必要がないということです。コンテンツを変更するコードで、独自のメッセージを任意に生成できます。もちろん、CListBox から独自のクラスを継承し、独自の仮想メソッドを追加する方がよいでしょう。
簡単です。リスト ボックスをサブクラス化し、LB_DELETESTRING と LB_RESETCONTENT のメッセージ ハンドラを追加するだけです。
詳細はこちらをご覧ください: