虚拟列表控件
虚拟列表控件是具有 LVS_OWNERDATA 样式的列表视图控件。 此样式允许控件支持项计数到 DWORD (默认项计数只扩展到 int)。 但是,此样式提供的最大的优点是能够随时只有数据项的子集内存中。 这允许的虚拟列表视图控件大体用于信息大型数据库的使用,访问数据特定方案即。
备注
除了提供虚拟列表外在 CListCtrl的函数,则 MFC 还提供在 CListView 类的相同功能。
,在开发虚拟列表控件时,有一些兼容性问题您应了解。 有关更多信息,请参见兼容性问题列表视图控件主题的一节。 Windows SDK的。
处理 LVN_GETDISPINFO 通知
虚拟列表控件维护很少项信息。 除项目选择和焦点信息,所有项目信息由控件的所有者控制。 信息由框架请求。 LVN_GETDISPINFO 通知消息。 若要提供请求的信息,所有者虚拟列表控件 (或控件) 必须处理此通知。 这可以轻松地执行使用 " 属性 " 窗口 (请参见 映射到功能的消息)。 提供的代码应类似于下面的示例 (其中 CMyDialog 拥有虚拟列表控件对象,而对话处理通知):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
在 LVN_GETDISPINFO 通知消息的处理过程,您必须检查哪些类型的信息请求。 可能的值包括:
必须填写LVIF_TEXTpszText 成员。
必须填写LVIF_IMAGEiImage 成员。
必须填写LVIF_INDENT 这个 iIndent 成员。
必须填写LVIF_PARAMlParam 成员。 (子项中不存在的。)
必须填写LVIF_STATE 状态成员。
然后应提供任何信息请求返回该结构。
下面的示例 (来自通知处理程序的主体列表控件对象的) 通过提供项的文本缓冲区和图像的信息演示一种可能的方法:
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
LV_ITEM* pItem = &(pDispInfo)->item;
int iItem = pItem->iItem;
if (pItem->mask & LVIF_TEXT) //valid text buffer?
{
switch(pItem->iSubItem)
{
case 0: //fill in main text
_tcscpy_s(pItem->pszText, pItem->cchTextMax,
m_Items[iItem].m_strItemText);
break;
case 1: //fill in sub item 1 text
_tcscpy_s(pItem->pszText, pItem->cchTextMax,
m_Items[iItem].m_strSubItem1Text);
break;
case 2: //fill in sub item 2 text
_tcscpy_s(pItem->pszText, pItem->cchTextMax,
m_Items[iItem].m_strSubItem2Text);
break;
}
}
if (pItem->mask & LVIF_IMAGE) //valid image?
{
pItem->iImage = m_Items[iItem].m_iImage;
}
缓存和虚拟列表控件
因为此类型列表控件供大使用数据集,建议您缓存请求项数据检索提高性能。 该结构提供了缓存提示的结构对优化缓存的帮助通过发送 LVN_ODCACHEHINT 通知消息。
下面的示例更新一个范围的缓存传递给处理程序函数。
void CMyDialog::OnLvnOdcachehintList3(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCACHEHINT pCacheHint = reinterpret_cast<LPNMLVCACHEHINT>(pNMHDR);
// Update the cache with the recommended range.
for (int i = pCacheHint->iFrom; i <= pCacheHint->iTo; i++)
{
m_Items[i].m_iImage = i % 2;
m_Items[i].m_strItemText.Format(_T("Item %d"), i);
m_Items[i].m_strSubItem1Text = _T("Sub 1");
m_Items[i].m_strSubItem2Text = _T("Sub 2");
}
*pResult = 0;
}
有关准备和维护缓存的更多信息,请参见列表视图控件主题的缓存管理部门在 Windows SDK的。
查找特定项目
,在特定列表控件项目需要找到时,虚拟 LVN_ODFINDITEM 发送通知消息列表控件。 发送通知消息,在列表视图控件接收快速访问键时,或者在收到 LVM_FINDITEM 消息时返回。 在 LVFINDINFO 结构形式,搜索发送信息,是 NMLVFINDITEM 结构的成员。 处理此消息通过重写 OnChildNotify 功能。列表控件对象,并在处理程序的主体,检查 LVN_ODFINDITEM 消息。 如果找到,请执行适当的操作。
您应准备搜索匹配项列表视图控件提供的信息的项目。 您应返回项目的索引,如果成功或 -1; 如果未找到匹配的项。