CVSListBox уведомление после удаления - PullRequest
3 голосов
/ 19 декабря 2008

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 19 декабря 2008

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

  • Выполните обработку в переопределении OnBeforeRemoveItem, как если бы элемент уже был удален
  • Создайте свое собственное событие OnAfterItemRemoved
  • Проверьте, можете ли вы получить дескриптор базового элемента управления списком (каким бы он ни был) и перехватить одно из его событий
0 голосов
/ 19 августа 2012

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

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);
        }
};

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

...