C++ 虚拟列表控件(MFC)

C++ 虚拟列表控件(MFC),c++,windows,user-interface,mfc,controls,C++,Windows,User Interface,Mfc,Controls,我使用列表控件来显示向量中元素的表示。单击列表时,另一个控件将显示有关该元素的信息。元素的索引当前由其在控件中的索引确定,但是,如果我希望对结果进行排序或筛选,这将不再有效 有人告诉我可以使用虚拟列表控件,但MSDN不是很友好,有人能告诉我如何使用虚拟列表控件吗?坦率地说-将数据(数据向量中的位置)绑定到列表控件中的数据表示(列表中的位置ctrl)这是我会远离的 在MFC中,每个控件都有一个“Data”DWORD成员变量-在MFC中编码时,我总是为在相关行引用的指针中添加和传递的每个项调用“Se

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

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

坦率地说-将数据(数据向量中的位置)绑定到列表控件中的数据表示(列表中的位置ctrl)这是我会远离的

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

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

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

或者类似的事情

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

坦率地说-将数据(数据向量中的位置)绑定到列表控件中的数据表示(列表ctrl中的位置)这是我会远离的

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

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

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

或者类似的事情


或者,如果不想使用指针,请在行的itemdata中保留原始向量中的项索引(只需将其传递到上面的FN中)。

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

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


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

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

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


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

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

我个人看到,持有大量数据的列表的性能大幅提高。然而,要实现它,需要做的工作要多得多,因此对于数据不多的简单用途,我建议远离它

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


我没有现成的例子给你。但是你可以看看codeguru,我很确定有很多很好的例子可以从这里开始。

这取决于你需要的性能

我个人看到,持有大量数据的列表的性能大幅提高。然而,要实现它,需要做的工作要多得多,因此对于数据不多的简单用途,我建议远离它

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


我没有现成的例子给你。但是你可以看看codeguru,我很确定有很多很好的例子可以从这里开始。

虚拟列表控件的用途完全不同:当你的列表中有很多项(我想是2500+项)时,你应该出于性能考虑使用它


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

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


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

+1这将解决排序问题。所有者数据(虚拟)不是答案。+1这将解决排序问题。所有者数据(虚拟)不是答案。