【问题标题】:Virtual List Controls (MFC)虚拟列表控件 (MFC)
【发布时间】:2010-09-16 06:57:35
【问题描述】:

我正在使用列表控件来显示向量中元素的表示。当单击列表时,另一个控件会显示有关该元素的信息。元素的索引当前由它在控件中的索引确定,但是如果我想对结果进行排序或过滤,这将不再起作用。

有人告诉我可以使用虚拟列表控件,但是 MSDN 不是很友好,有人可以告诉我如何使用虚拟列表控件吗?

【问题讨论】:

    标签: c++ windows user-interface mfc controls


    【解决方案1】:

    坦率地说 - 将数据(数据向量中的位置)与列表控件中的数据表示(列表 ctrl 中的位置)联系起来是我会远离的。

    在 MFC 中,每个控件都有一个“Data”DWORD 成员变量 - 在 MFC 中编码时,我总是为添加的每个项目调用“SetItemData”,并传入相关行引用的指针,例如 YourListCtrl.SetItemData((DWORDPTR)&YourData);

    然后当 ListCtrl 项目被选中时,你只需调用

    DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));

    或者类似的东西。

    或者 - 如果您不想使用指针 - 在您的行的 itemdata 中保存原始向量中项目的索引(只需将其传递到上面的 fns 中)。

    【讨论】:

    • +1 这将解决您的排序问题。所有者数据(虚拟)不是答案。
    【解决方案2】:

    要使用虚拟列表控件,请设置 LVS_OWNERDATA 样式。然后您需要处理 LVN_GETDISPINFO 通知消息(通过 WM_NOTIFY 发送)。

    如果您这样做,您将对数据负全部责任,包括数据显示的顺序。因此,由您来处理排序等。

    到目前为止,最简单的方法就是使用项目数据来设置/获取可用于检索原始数据的 ID,无论是矢量索引还是指向数据的指针,甚至是关联的键容器。

    【讨论】:

      【解决方案3】:

      这实际上取决于您需要的性能。

      我亲眼目睹了拥有大量数据的列表的性能显着提高。然而,实现它更多的工作,因此对于没有太多数据的简单用途,我建议远离它。

      基本上,虚拟列表控件发生的情况是您的数据位于您自己的某个数据结构中的某个位置。由于列表视图仅显示整个数据的一小部分,因此它会在发生某些事情时向您查询要显示的内容(需要重绘、向上或向下滚动、更改排序等)。

      我没有方便的例子给你。但是你可以看看codeguru,我很确定有很好的例子可以开始。

      【讨论】:

        【解决方案4】:

        虚拟列表控件的用途完全不同:当您的列表中有很多项目(我会说 2500 多个)时,出于性能考虑,您应该使用它。

        在您的情况下,您只需要按照 NotJarvis 的解释将矢量索引存储在列表项数据中。

        【讨论】:

          猜你喜欢
          • 2018-08-21
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 2010-09-21
          • 2015-04-30
          • 2020-10-03
          • 2012-04-25
          • 1970-01-01
          相关资源
          最近更新 更多