Win32(C++): - 如何使列表项可折叠

Shu*_*bra 2 c++ winapi listitem collapsable win32gui

我有一个列表框,其中有多个列表项.我希望实现类似于单击列表项的内容,它将折叠并显示所单击项的摘要:

在此输入图像描述

我已经在网上搜索了很长一段时间,但没有得到任何好的解决方案.我是Win32的新手.有关如何处理此问题的任何建议,我应该使用哪种控件.任何帮助将不胜感激.

Rem*_*eau 5

标准ListBox和ListView控件本身不支持展开/折叠项目,但是可以在ListBox中实现它,但需要一些额外的工作.

为ListBox提供LBS_OWNERDRAWVARIABLE 列表框样式,以允许列表包含不同高度的项目.当一个新项目被添加到列表中时,ListBox将向WM_MEASUREITEM其父窗口发送一条消息,询问该项目的初始高度.根据项目是显示为折叠还是展开,返回适当的高度.

将项目添加到列表后,您可以向ListBox发送一条LB_SETITEMHEIGHT消息,根据该项目现在是否应显示为折叠或展开来为该项目指定新的高度.然后使ListBox无效以触发对项目的重绘.

该LBS_OWNERDRAW...风格需要每当列表框发送您手动绘制每个列表项WM_DRAWITEM消息给它的父窗口.您可以根据需要在所提供的项目上绘制所请求的项目HDC,例如使用该DrawText()功能,根据项目的文本当前是显示为折叠还是展开来配置其参数.还可以使用消息本身提供的状态信息来根据需要配置HDC字体和背景/前景色(在呈现选定和聚焦状态的项目时尤为重要).

随着到位,你剩下要做的一切都让你的点击处理程序确定被点击的项目的索引(通过GetMessagePos(),ScreenToClient()和LB_ITEMFROMPOINT),然后分配给它基于其新的扩张/收缩状态一个新的高度,并让生成的重绘相应地绘制新文本.