Win32 (C++): - Как сделать элемент списка сворачиваемым

У меня есть список, в котором есть несколько элементов списка. Я хочу реализовать что-то вроде того, что если мы нажмем элемент списка, он рухнет и покажет сводку выбранного элемента:

введите здесь описание изображения

Я довольно долго искал это в Интернете, но не нашел хорошего решения. Я очень новичок в Win32. Любые предложения о том, как подойти к этому, например, какой элемент управления я должен использовать. Любая помощь будет оценена.


person Shubham Chhabra    schedule 03.10.2016    source источник
comment
Какой у Вас вопрос? У вас есть код, который не работает? Затем покажите свой минимально воспроизводимый пример. Вы хотите код, который работает? Мы не делаем этого здесь. Вы хотите руководство к учебнику или к коду, который работает? Мы и здесь этого не делаем.   -  person Lightness Races in Orbit    schedule 03.10.2016
comment
@VipinNagar Вопрос конкретно о winapi. Ответ, который вы предоставили, касается html...   -  person    schedule 03.10.2016
comment
Список не предоставляет эту функцию, также не работает представление списка. Вы либо реализуете свою собственную, либо используете библиотеку, например MFC (см. CMFCPropertyGridCtrl и подобные). @VipinNagar: Попытка помочь — это нормально. Однако, если попытаться — это все, что вы можете предложить, просто не делайте этого.   -  person IInspectable    schedule 03.10.2016
comment
Можно сделать со стандартным ListBox. Я сделал это раньше. Но для этого требуется дополнительная работа.   -  person Remy Lebeau    schedule 04.10.2016
comment
ListView ДЕЙСТВИТЕЛЬНО поддерживает это с некоторого времени (я думаю, Vista). Обратите внимание на группы в списках. LVM_ENABLEGROUPVIEW, LVM_INSERTGROUP. Вам необходимо включить визуальные элементы управления (добавьте ComnCtr 6.0 в свой манифест — см. здесь)   -  person Marco Freudenberger    schedule 13.08.2020


Ответы (1)


Стандартный ListBox и ListView изначально не поддерживают развертывание/свертывание элементов, однако это можно реализовать в ListBox с дополнительной работой.

Присвойте ListBox LBS_OWNERDRAWVARIABLE стиль списка, чтобы список, содержащий элементы разной высоты. Когда в список добавляется новый элемент, ListBox отправляет WM_MEASUREITEM сообщение родительскому окну с запросом начальной высоты элемента. Возвращает соответствующую высоту в зависимости от того, должен ли элемент отображаться в свернутом или развернутом виде.

Как только элемент добавлен в список, вы можете отправить ListBox LB_SETITEMHEIGHT, чтобы назначить новую высоту для этого элемента в зависимости от того, должен ли он теперь отображаться свернутым или развернутым. Затем аннулируйте ListBox, чтобы вызвать перерисовку элементов.

Стили LBS_OWNERDRAW... требуют, чтобы вы вручную рисовали каждый элемент списка всякий раз, когда ListBox отправляет WM_DRAWITEM сообщение своему родительскому окну. Вы можете нарисовать запрошенный элемент на предоставленном HDC как хотите, например, с помощью DrawText(), настраивая свои параметры в зависимости от того, отображается ли в данный момент текст элемента в свернутом или развернутом виде. Также используйте информацию о состоянии, предоставленную самим сообщением, для настройки шрифта HDC и цветов фона/переднего плана по желанию (особенно важно при рендеринге элементов в выбранном и сфокусированном состояниях).

После этого все, что вам осталось сделать, это заставить ваш обработчик кликов определить индекс элемента, на который нажали (через GetMessagePos(), ScreenToClient() и LB_ITEMFROMPOINT ), а затем назначьте ему новую высоту в зависимости от его нового расширенного/свернутого состояния и позвольте результирующей перерисовке соответствующим образом нарисовать новый текст.

person Remy Lebeau    schedule 04.10.2016