winapi — Win32 (C ++): — Как сделать элемент списка разборным

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

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

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

2

Решение

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

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

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

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]