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