Как обрабатывать изменение состояния группы CListCtrl (свернуто\развернуто) в MFCC++

Программы на C++. Форум разработчиков
Anonymous
Как обрабатывать изменение состояния группы CListCtrl (свернуто\развернуто) в MFC

Сообщение Anonymous »

Я реализую группировку для CListCtrl в устаревшем приложении MFC (эта часть кода содержит комментарии 2000 года).
Существует пользовательский класс, который унаследован (косвенно) от CListCtrl в файле .cpp этого класса содержится ~2 тыс. строк кода.
Фактические данные, представленные этим ListCtrl, собираются из какой-либо службы и кэшируются в элементе данных. этого пользовательского производного класса списка.
Базовый CListCtrl содержит элементы в виде пустых строк без текста или каких-либо других данных, кроме lParam, которому присвоен идентификатор фактический элемент данных, и теперь он также имеет iGroupId

Код: Выделить всё

listItem.mask = LVIF_PARAM | LVIF_GROUPID;
Все фактические данные отображаются в списке с помощью специального поведения, для значков он вызывает ImageList_DrawEx(), для текста DrawText () вместо SetItemText() в одном столбце отображается индикатор выполнения рисования прямоугольника, а для одного столбца также помещается кнопка в соответствующий прямоугольнику строки\столбца.
Поэтому, когда я добавил LVGS_COLLAPSIBLE, чтобы включить группировку в списке, он каким-то образом хорошо работал со всем этим пользовательским рендерингом, за исключением кнопок, которые не скрываются, когда элементы сворачиваются вместе с их группой. Кнопки остаются там, где они были, не перемещаются и перекрывают другие элементы, потому что другие элементы перерисовываются, а эти кнопки — нет.

РЕДАКТИРОВАТЬ: это настоящие сохраненные кнопки в члене данных производного класса списка они создаются с помощью CButton::Create() в заданных координатах на экране, а затем при необходимости перемещаются с помощью CWnd::MoveWindow()
Я решил, что могу просто скрыть\удалить кнопки, когда функция рисования элемента выполняется для элемента в свернутой группе, но эта функция рисования вызывается для элемента только тогда, когда элемент виден, а не свернуто.
Поэтому мне нужен способ обработки изменения состояния группы, чтобы вызвать отрисовку этого элемента вручную, но я сам не сворачиваю\разворачиваю группы.
Состояние всех групп — LVGS_COLLAPSIBLE или (0x08), поэтому их можно свернуть\развернуть в графическом интерфейсе по умолчанию, и я могу проверить, является ли их состояние LVGS_COLLAPSED или (0x01)< /code>

Код: Выделить всё

// idOfChangedGroup = ???;

LVGROUP group = { 0 };
group.cbSize = sizeof(group);
group.mask = LVGF_STATE;
group.stateMask = LVGS_NORMAL | LVGS_COLLAPSIBLE | LVGS_COLLAPSED;
GetGroupInfo(idOfChangedGroup, &group);

if (group.state & LVGS_COLLAPSED){
// hide button associated with item
}
else{
// show button associated with item
}
Проблема в том, что я не могу понять, где взять идентификатор группы, которая была свернута\развернута в графическом интерфейсе.
Я не хорошо разбираюсь в MFC, но я думаю, что это следует сделать каким-то образом в OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) или OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult), насколько я понимаю, эти функции обрабатывают сообщения\события из фреймворка\системы, поэтому я считаю, что есть способ обработать изменение состояния группы.
Но я не могу найти никаких уведомлений, связанных с изменением состояния группы. состояние группы и четкое руководство\пример того, как это сделать.
Пожалуйста, дайте мне совет или указание!
Этот материал настолько СТАРЫЙ, и я изо всех сил пытаюсь найти какую-либо полезную информацию. ...

Подробнее здесь: https://stackoverflow.com/questions/784 ... ded-in-mfc

Вернуться в «C++»