我使用 CListBox::SetItemData 在我的所有者绘制的 CListBox 派生类中存储指向某些数据的指针,并且我希望列表框本身跟踪它并在不再需要时释放内存。
为此,每次删除项目时都需要通知我(包括 LB_RESETCONTENT 以及删除项目的所有其他可能情况)。有没有我可以处理的事件或事件来实现这一目标?
不会。ListBox 只会为用户所做的事情生成通知。用户不能删除或添加或清空列表框,这只能通过您自己的代码来完成。所以这里的理念是控件不必告诉你你已经知道的事情。您可以在修改内容的代码中任意生成自己的消息。但是当然从 CListBox 继承你自己的类并添加你自己的虚拟方法会更好。
作为它的所有者,LBS_OWNERDRAW*
您可以留意其中一种风格WM_DELETEITEM
;
当列表框或组合框被销毁或项目被 、 、 或 消息删除时发送给列表框或组合
LB_DELETESTRING
框LB_RESETCONTENT
的CB_DELETESTRING
所有者CB_RESETCONTENT
。系统会为每个已删除的项目发送一条WM_DELETEITEM
消息
由于您已经对列表框进行了子类化,因此“正确”设计(IMO)将向列表框添加数据管理功能,然后列表框将知道何时删除项目并可以根据需要删除数据。我的意思是,假设您的列表跟踪人员,您将 AddPerson(Person p) 和 RemovePerson(Person p) 方法添加到您的类。RemovePerson 的实现将从列表中删除相应的条目,并删除与其相关的所有数据。所以不要使用 CListBox::DeleteString 删除东西,使用你自己实现的更高级别的 API。
这很容易 - 只需子类化列表框并为 LB_DELETESTRING 和 LB_RESETCONTENT 添加消息处理程序
有关详细信息,请参见此处: