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

时间:2016-10-03 08:34:04

标签: c++ winapi listitem win32gui collapsable

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

enter image description here

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

1 个答案:

答案 0 :(得分:5)

标准ListBoxListView控件本身不支持展开/折叠项目,但是可以在ListBox中实现它并进行一些额外的工作。

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

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

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

有了这个,你剩下要做的就是让你的点击处理程序确定被点击的项目的索引(通过GetMessagePos()ScreenToClient()LB_ITEMFROMPOINT),然后根据新的展开/折叠状态为其指定一个新的高度,并让生成的重绘相应地绘制新文本。