Стандартный 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
winapi
. Ответ, который вы предоставили, касается html... - person   schedule 03.10.2016