1

CListBox::SetItemData を使用して、所有者が作成した CListBox 派生クラスのデータへのポインターを格納します。リストボックス自体がそれを追跡し、不要になったときにメモリを解放したいと考えています。

そのためには、アイテムが削除されるたびに通知を受ける必要があります (LB_RESETCONTENT およびアイテムが削除される可能性のある他のすべてのケースを含む)。それを達成するために処理できるイベントはありますか?

4

4 に答える 4

1

とにかくリストボックスをすでにサブクラス化しているので、「適切な」設計は、データ管理機能をリストボックスに追加することです。これにより、アイテムがいつ削除されるかがわかり、必要に応じてデータを削除できます。つまり、リストが人を追跡しているとすると、AddPerson(Person p)メソッドとRemovePerson(Person p)メソッドをクラスに追加します。RemovePersonを実装すると、リストからそれぞれのエントリが削除され、それに関連するすべてのデータが削除されます。したがって、CListBox :: DeleteStringを使用して削除するのではなく、自分で実装する高レベルのAPIを使用してください。

于 2012-04-11T15:06:39.113 に答える
1

いいえ。ListBox は、ユーザーが行ったことに対する通知のみを生成します。ユーザーは、独自のコードでのみ実行できるリスト ボックスを削除、追加、または空にすることはできません。したがって、ここでの哲学は、コントロールはユーザーが既に知っていることをユーザーに伝える必要がないということです。コンテンツを変更するコードで、独自のメッセージを任意に生成できます。もちろん、CListBox から独自のクラスを継承し、独自の仮想メソッドを追加する方がよいでしょう。

于 2012-04-11T13:37:21.427 に答える
0

簡単です。リスト ボックスをサブクラス化し、LB_DELETESTRING と LB_RESETCONTENT のメッセージ ハンドラを追加するだけです。

詳細はこちらをご覧ください:

http://www.codeguru.com/cpp/controls/listbox/article.php/c4759/CListBox-with-the-Horizo​​ntal-Scroll-Bar-that-Works.htm

于 2012-04-11T13:50:48.613 に答える