1

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

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

4

4 回答 4

5

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

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

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

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

或者类似的东西。

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

于 2008-10-09T14:28:18.633 回答
1

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

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

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

于 2008-10-09T14:59:15.997 回答
1

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

我个人已经看到包含大量数据的列表的性能有显着提高。然而,实现起来需要做更多的工作,因此对于没有太多数据的简单用途,我建议远离它。

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

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

于 2008-10-09T15:21:13.003 回答
1

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

在您的情况下,您所需要的只是将矢量索引存储在列表项数据中,正如 NotJarvis 解释的那样。

于 2008-10-09T18:34:54.300 回答