【问题标题】:Win32 (C++) :- How to make a list item collapsibleWin32 (C++) :- 如何使列表项可折叠
【发布时间】:2017-02-11 03:39:12
【问题描述】:

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

我已经在网上搜索了很长一段时间,但没有任何好的解决方案。我对 Win32 很陌生。关于如何处理这个问题的任何建议,比如我应该使用哪个控件。任何帮助将不胜感激。

【问题讨论】:

  • 您的问题是什么?你有不工作的代码吗?然后显示您的minimal reproducible example。你想要有效的代码吗?我们在这里不这样做。您想要指导教程或有效的代码吗?我们这里也不这样做。
  • @VipinNagar 这个问题专门针对winapi。您提供的答案是关于 html...
  • List Box 不提供该功能,List View 也不提供。您将实现自己的,或使用库,如 MFC(请参阅CMFCPropertyGridCtrl 和类似内容)。 @VipinNagar:尝试提供帮助很好。但是,如果您只能提供尝试,那就不要这样做。
  • 可以使用标准列表框。我以前做过。但它确实需要一些额外的工作才能完成。
  • A ListView 确实支持这一点(我认为是 Vista)。在 Listviews 上寻找“组”。 LVM_ENABLEGROUPVIEW,LVM_INSERTGROUP。您需要启用可视化控件(将 ComnCtr 6.0 添加到您的清单 - 请参见此处)

标签: c++ winapi listitem win32gui collapsable


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 2013-04-06
    • 1970-01-01
    • 2018-12-24
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多