2012-04-11 1 views
1

私は、CListBox :: SetItemDataを使用して、ownerdrawn CListBoxから派生したクラス内のいくつかのデータへのポインタを格納しています。リストボックス自体を追跡し、不要になったときにメモリを解放します。リストボックスにアイテムが削除されたときに通知を受け取りますか?

これは、アイテムが削除されるたびに(LB_RESETCONTENTなどのアイテムが削除された場合を含む)通知される必要があるためです。それを達成するために私が扱うことのできる出来事がありますか?

答えて

1

その所有者がすることができますLBS_OWNERDRAW*スタイルのいずれかで描かれたようWM_DELETEITEMを見てください。リストボックスまたは コンボボックスが破棄されるとき、またはアイテムが LB_DELETESTRINGLB_RESETCONTENTCB_DELETESTRING、又はCB_RESETCONTENT メッセージによって除去される場合、リストボックスまたはコンボボックスの所有者に送信

。システムは、それぞれのWM_DELETEITEMメッセージはすでにとにかくリストボックスをサブクラス化しているので、「適切な」デザインは(IMO)を知っていると思われる、リストボックスにデータ管理機能を追加することです 項目

1

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

0

それは簡単です - ちょうど詳細はこちらを参照してください。リストボックスをサブクラス化しLB_DELETESTRINGとLB_RESETCONTENT

のためのメッセージハンドラを追加します。

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

+0

アイテムが残っている間にダイアログボックスが表示されても、LB_RESETCONTENTが表示されるのはなぜですか?また、WM_DESTROYも処理する必要がありますか? – sashoalm

+0

あなたはWM_DESTROYも処理する必要があります – Isso

1

を削除送信します項目が削除され、必要に応じてデータを削除することができます。つまり、あなたのリストが人を追跡しているとしましょう。あなたのクラスにAddPerson(Person p)メソッドとRemovePerson(Person p)メソッドを追加します。 RemovePersonの実装は、リストからそれぞれのエントリを削除し、それに関連するすべてのデータを削除します。したがって、CListBox :: DeleteStringを使用して物を削除しないで、自分で実装する高水準のAPIを使用してください。

関連する問題