繁体   English   中英

虚拟列表控件(MFC)

[英]Virtual List Controls (MFC)

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

有人告诉我可以使用虚拟列表控件,但是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解释的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM