【问题标题】:Getting notified when a list box has an item removed?当列表框删除项目时收到通知?
【发布时间】:2012-04-11 13:17:28
【问题描述】:

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

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

【问题讨论】:

    标签: c++ winapi mfc listbox clistbox


    【解决方案1】:

    作为使用LBS_OWNERDRAW* 样式之一绘制的所有者,您可以留意WM_DELETEITEM

    发送给列表框或组合框的所有者时,列表框或 组合框被破坏或项目被 LB_DELETESTRINGLB_RESETCONTENTCB_DELETESTRINGCB_RESETCONTENT 信息。系统会为每个已删除的邮件发送WM_DELETEITEM 消息 项目

    【讨论】:

      【解决方案2】:

      没有。 ListBox 只为用户所做的事情生成通知。用户不能删除或添加或清空列表框,这只能通过您自己的代码来完成。所以这里的理念是控件不必告诉你你已经知道的事情。您可以在修改内容的代码中任意生成自己的消息。但是当然从 CListBox 继承你自己的类并添加你自己的虚拟方法会更好。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          这很简单 - 只需子类化列表框并为 LB_DELETESTRING 和 LB_RESETCONTENT 添加消息处理程序

          详情请看这里:

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

          【讨论】:

          • 如果对话框在仍有项目的情况下被销毁,会发生什么情况,它仍然会获得 LB_RESETCONTENT,还是我也必须处理 WM_DESTROY?
          • 你也应该处理 WM_DESTROY
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-07
          相关资源
          最近更新 更多