在列表框删除项目时收到通知

Getting notified when a list box has an item removed?

本文关键字:通知 删除项目 列表      更新时间:2023-10-16

我使用 CListBox::SetItemData 在我的所有者绘制的 CListBox 派生类中存储指向某些数据的指针,我希望列表框本身跟踪它并在不再需要时释放内存。

为此,我需要在每次删除项目时收到通知(包括LB_RESETCONTENT以及删除项目的所有其他可能情况)。是否有一个或多个事件可以处理来实现这一点?

作为它的主人用一种LBS_OWNERDRAW*风格绘制的,你可以留意WM_DELETEITEM;

当列表框或组合框或

列表框或 组合框被销毁或当项目被移除时 LB_DELETESTRINGLB_RESETCONTENTCB_DELETESTRINGCB_RESETCONTENT 消息。系统为每个已删除的内容发送一条WM_DELETEITEM消息 项目

No. 列表框仅针对用户执行的操作生成通知。 用户无法删除、添加或清空列表框,这只能由您自己的代码完成。 所以这里的哲学是,控件不必告诉你你已经知道的事情。 您可以在修改内容的代码中任意生成自己的消息。 但是,当然,从 CListBox 继承您自己的类并添加您自己的虚拟方法会更好。

由于您已经对列表框进行了子类化,因此"正确"的设计(IMO)是将数据管理功能添加到列表框中,然后它将知道何时删除项目并可以根据需要删除数据。我的意思是,假设您的列表跟踪人员,您将添加AddPerson(Person p)和RemovePerson(Person p)方法到您的类中。RemovePerson 的实现将从列表中删除相应的条目,并删除与之相关的所有数据。因此,不要使用 CListBox::D eleteString 来删除内容,请使用您自己实现的更高级别的 API。

这很容易 - 只需对列表框进行子类化,并为LB_DELETESTRING和LB_RESETCONTENT添加消息处理程序

详情请看这里:

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