Получаете ли вы уведомление, когда в поле со списком удален элемент?
Я использую 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
Смотрите здесь для деталей: