我有一个列表框,其中有多个列表项。我希望实现类似于单击列表项的内容,它将折叠并显示所单击项的摘要:
我一直在网上搜索这段时间,但还没有得到任何好的解决方案。我是Win32的新手。有关如何处理此问题的任何建议,我应该使用哪种控件。任何帮助将不胜感激。
答案 0 :(得分:5)
标准ListBox和ListView控件本身不支持展开/折叠项目,但是可以在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
),然后根据新的展开/折叠状态为其指定一个新的高度,并让生成的重绘相应地绘制新文本。