虚拟列表控件

虚拟列表控件是具有 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; 如果未找到匹配的项。

请参见

参考

使用CListCtrl

概念

控件(MFC)