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

Win32 (C++) :- How to make a list item collapsible

我有一个列表框,其中有多个列表项。我想实现类似如果我们单击列表项,它会折叠并显示所单击项的摘要:

我在网上找了好久,一直没有找到好的解决办法。我对 Win32 很陌生。关于如何解决这个问题的任何建议,比如我应该使用哪个控件。任何帮助将不胜感激。

标准 ListBox and ListView 控件本身不支持 expanding/collapsing 项,但是可以通过一些额外的工作在 ListBox 中实现它。

向 ListBox 发送 LBS_OWNERDRAWVARIABLE list box style to allow the list to contain items of different heights. When a new item is added to the list, the ListBox will send a WM_MEASUREITEM 消息给它的父级 window 询问项目的初始高度。 Return 根据项目显示为折叠还是展开的适当高度。

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

LBS_OWNERDRAW... 样式要求您在 ListBox 发送 WM_DRAWITEM message to its parent window. You can draw the requested item on the provided HDC however you want, such as with the DrawText() 函数时手动绘制每个列表项,并根据项的文本当前显示为折叠还是展开来配置其参数。还可以使用消息本身提供的状态信息来根据需要配置 HDC 的字体和 background/foreground 颜色(在呈现处于选中和聚焦状态的项目时尤其重要)。

有了它,您剩下要做的就是让您的点击处理程序确定被点击项目的索引(通过 GetMessagePos(), ScreenToClient(), and LB_ITEMFROMPOINT),然后根据其新高度为其分配新高度expanded/collapsed 状态,并让生成的重绘相应地绘制新文本。