Существует пользовательский класс, который унаследован (косвенно) от CListCtrl в файле .cpp этого класса содержится ~2 тыс. строк кода.
Фактические данные, представленные этим ListCtrl, собираются из какой-либо службы и кэшируются в элементе данных. этого пользовательского производного класса списка.
Базовый CListCtrl содержит элементы в виде пустых строк без текста или каких-либо других данных, кроме lParam, которому присвоен идентификатор фактический элемент данных, и теперь он также имеет iGroupId
Код: Выделить всё
listItem.mask = LVIF_PARAM | LVIF_GROUPID;Поэтому, когда я добавил 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