虚拟列表控件(MFC)

时间:2008-10-09 14:06:40

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

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

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

4 个答案:

答案 0 :(得分:5)

坦率地说 - 将数据(数据向量中的位置)绑定到列表控件中的数据表示(列表控件中的位置)是我不想做的事情。

在MFC中,每个控件都有一个“数据”DWORD成员变量 - 当在MFC中编码时,我总是将每个项目称为“SetItemData”,并在指针中传递相关行,例如, YourListCtrl.SetItemData((DWORDPTR)&YourData);

然后当选择ListCtrl项时,您只需调用

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

或者某些事情。

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

答案 1 :(得分:1)

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

如果您这样做,则您对数据负全部责任,包括数据的显示顺序。因此,您可以自行处理排序等等。

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

答案 2 :(得分:1)

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

我个人看到持有大量数据的列表的MAJOR性能提升。但是,实施更多工作,因此对于没有太多数据的简单用途,我建议远离它。

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

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

答案 3 :(得分:1)

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

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