Уведомление CVSListBox после удаления

Я только что добавил в проект один из новых (MFC Feature Pack) элементов управления CVSListBox. Список элементов в элементе управления отслеживается некоторыми другими объектами в моем приложении, поэтому мне нужно получать много уведомлений из списка, когда что-то меняется, чтобы я мог обновлять другие вещи. Для тех, кто не знаком с управлением, есть панель кнопок, которая предлагает базовые функции добавления/удаления/изменения порядка.

Элемент управления CVSListBox предлагает переопределяемые виртуальные функции для таких вещей, как добавление или переименование элементов и изменение их порядка — все это прекрасно работает.

Однако для удаления элементов единственным переопределением является OnBeforeRemoveItem, которое вызывается ПЕРЕД удалением элемента и из которого необходимо вернуть TRUE/FALSE, чтобы разрешить удаление. После того, как удаление произошло, нет специального уведомления.

Как лучше всего получить уведомление ПОСЛЕ удаления?

Очевидно, что здесь можно взломать что-то ужасное, поскольку после удаления будет событие изменения выбора, и можно будет удерживать флаг перед удалением, чтобы сказать, что следующее изменение выбора является особенным. Но я чувствую, что мне не хватает чего-то более чистого и очевидного. Какие-либо предложения?


person Will Dean    schedule 19.12.2008    source источник


Ответы (2)


Предполагая, что элемент действительно будет удаляться каждый раз, вы можете:

  • Выполните обработку в переопределении OnBeforeRemoveItem, как если бы элемент уже был удален
  • Создайте собственное событие OnAfterItemRemoved
  • Посмотрите, можете ли вы получить дескриптор базового элемента управления списком (каким бы он ни был) и перехватить одно из его событий.
person Aidan Ryan    schedule 19.12.2008

Попробуйте что-то вроде этого:

class my_lbox : public CVSListBox
{
    protected:

        BOOL OnBeforeRemoveItem(int what_item)
        {
            CString txt = GetItemText(what_item);
            DWORD_PTR idata = GetItemData(what_item);

            if(true) //up to you to check if this item can be removed
            {
                OnAfterRemoveItem(txt,idata);
                return TRUE;
            }
            return FALSE;
        }

        void OnAfterRemoveItem(const CString& txt, DWORD_PTR idata)
        {
            CString info;
            info.Format(L"Removing item:'%s'",txt);

            MessageBox(info);
        }
};

Надеюсь, поможет.

person Albertino80    schedule 19.08.2012