我正在使用列表控件来显示向量中元素的表示。当单击列表时,另一个控件会显示有关该元素的信息。元素的索引当前由它在控件中的索引确定,但是如果我希望对结果进行排序或过滤,这将不再有效。
有人告诉我可以使用虚拟列表控件,但是 MSDN 不是很友好,有人可以告诉我如何使用虚拟列表控件吗?
我正在使用列表控件来显示向量中元素的表示。当单击列表时,另一个控件会显示有关该元素的信息。元素的索引当前由它在控件中的索引确定,但是如果我希望对结果进行排序或过滤,这将不再有效。
有人告诉我可以使用虚拟列表控件,但是 MSDN 不是很友好,有人可以告诉我如何使用虚拟列表控件吗?
坦率地说 - 将数据(数据向量中的位置)与列表控件中的数据表示(列表 ctrl 中的位置)联系起来是我会远离的。
在 MFC 中,每个控件都有一个“Data”DWORD 成员变量 - 在 MFC 中编码时,我总是为添加的每个项目调用“SetItemData”,并传入相关行引用的指针,例如
YourListCtrl.SetItemData((DWORDPTR)&YourData);
然后当 ListCtrl 项目被选中时,你只需调用
DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));
或者类似的东西。
或者 - 如果您不想使用指针 - 在您的行的 itemdata 中保存原始向量中的项目索引(只需将其传递到上面的 fns 中)。
要使用虚拟列表控件,请设置 LVS_OWNERDATA 样式。然后您需要处理 LVN_GETDISPINFO 通知消息(通过 WM_NOTIFY 发送)。
如果您这样做,您将对数据负全部责任,包括显示的顺序。因此,由您来处理排序等。
到目前为止,最简单的方法是使用项目数据设置/获取可用于检索原始数据的 ID,无论是矢量索引还是指向数据的指针,甚至是关联容器的键。
这实际上取决于您需要的性能。
我个人已经看到包含大量数据的列表的性能有显着提高。然而,实现起来需要做更多的工作,因此对于没有太多数据的简单用途,我建议远离它。
基本上,虚拟列表控件发生的情况是,您的数据位于您自己的某些数据结构中。由于列表视图仅显示整个数据的一小部分,因此它会在发生某些事情时向您查询要显示的内容(需要重绘、向上或向下滚动、更改排序等)。
我没有方便的例子给你。但是你可以看看 codeguru,我很确定有很好的例子可以开始。
虚拟列表控件的目的是完全不同的:当您的列表中有很多项目(我会说 2500+)时,您应该出于性能原因使用它。
在您的情况下,您所需要的只是将矢量索引存储在列表项数据中,正如 NotJarvis 解释的那样。