Получаете ли вы уведомление, когда в поле со списком удален элемент?

Я использую CListBox::SetItemData для хранения указателя на некоторые данные в моем производном от CListBox классе, и я хотел бы, чтобы само окно списка отслеживало его и освобождало память, когда она больше не нужна.

Для этого мне нужно будет получать уведомления каждый раз, когда элемент удаляется (включая LB_RESETCONTENT и все возможные другие случаи, когда элемент удаляется). Есть ли событие или события, которые я могу обработать, чтобы достичь этого?

4 ответа

Решение

Как его владелец обращается с одним из 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 более высокого уровня, который вы реализуете сами.

Нет. ListBox генерирует уведомления только о том, что делает пользователь. Пользователь не может удалить, добавить или очистить список, что может быть сделано только вашим собственным кодом. Таким образом, философия здесь заключается в том, что контроль не должен говорить вам о чем-то, что вы уже знаете. Вы можете произвольно создать собственное сообщение в коде, который изменяет содержимое. Но, конечно, было бы лучше наследовать свой собственный класс от CListBox и добавлять свои собственные виртуальные методы.

Это просто - просто создайте подкласс списка и добавьте обработчики сообщений для LB_DELETESTRING и LB_RESETCONTENT

Смотрите здесь для деталей:

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

Другие вопросы по тегам