Compartir vía


Controles de lista virtual

Un control de lista virtual es un control de vista de lista que tiene el estilo LVS_OWNERDATA. Este estilo permite que el control admita un recuento de elementos hasta un DWORD (el recuento de elementos predeterminado solo se extiende a int). Sin embargo, la mayor ventaja proporcionada por este estilo es la capacidad de tener solo un subconjunto de elementos de datos en memoria en cualquier momento. Esto permite que el control de vista de lista virtual se preste para su uso con grandes bases de datos de información, donde ya existen métodos específicos de acceso a los datos.

Nota:

Además de proporcionar funcionalidad de lista virtual en CListCtrl, MFC también proporciona la misma funcionalidad en la clase CListView .

Hay algunos problemas de compatibilidad que debe tener en cuenta al desarrollar controles de lista virtual. Para obtener más información, vea la sección Problemas de compatibilidad del tema controles de List-View en Windows SDK.

Control de la notificación de LVN_GETDISPINFO

Los controles de lista virtual mantienen muy poca información de elementos. Excepto para la selección de elementos y la información de foco, el propietario del control administra toda la información del elemento. El marco solicita información a través de un mensaje de notificación LVN_GETDISPINFO. Para proporcionar la información solicitada, el propietario del control de lista virtual (o el propio control) debe controlar esta notificación. Esto se puede hacer fácilmente mediante el Asistente de clases (consulte Asignación de mensajes a funciones). El código resultante debe tener un aspecto similar al del ejemplo siguiente (donde CMyDialog posee el objeto de control de lista virtual y el cuadro de diálogo está controlando la notificación):

ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)

En el controlador del mensaje de notificación de LVN_GETDISPINFO, debe comprobar qué tipo de información se solicita. Los valores posibles son:

  • LVIF_TEXT El miembro pszText debe rellenarse.

  • LVIF_IMAGE El miembro iImage debe rellenarse.

  • LVIF_INDENT El miembro iIndent debe rellenarse.

  • LVIF_PARAM El miembro lParam debe rellenarse. (No está presente para los subelementos).

  • LVIF_STATE El miembro state debe rellenarse.

A continuación, debe proporcionar cualquier información que se solicite de vuelta al marco.

En el ejemplo siguiente (tomado del cuerpo del controlador de notificaciones para el objeto de control de lista) se muestra un método posible proporcionando información para los búferes de texto e imagen de un elemento:

NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO *>(pNMHDR);
LVITEM *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;
}

Almacenamiento en caché y controles de lista virtual

Dado que este tipo de control de lista está pensado para grandes conjuntos de datos, se recomienda almacenar en caché los datos de elementos solicitados para mejorar el rendimiento de recuperación. El marco proporciona un mecanismo de sugerencias de caché para ayudar a optimizar la memoria caché mediante el envío de un mensaje de notificación de LVN_ODCACHEHINT.

En el ejemplo siguiente se actualiza la memoria caché con el intervalo pasado a la función de controlador.

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;
}

Para obtener más información sobre cómo preparar y mantener una memoria caché, consulte la sección Administración de caché del tema controles de List-View en Windows SDK.

Buscar elementos específicos

El control de lista virtual envía el mensaje de notificación LVN_ODFINDITEM cuando es necesario encontrar un elemento de control de lista determinado. El mensaje de notificación se envía cuando el control de vista de lista recibe acceso rápido a la clave o cuando recibe un mensaje de LVM_FINDITEM. La información de búsqueda se envía en forma de una estructura LVFINDINFO , que es un miembro de la estructura NMLVFINDITEM. Controle este mensaje reemplazando la función OnChildNotify del objeto de control de lista y dentro del cuerpo del controlador, compruebe el mensaje de LVN_ODFINDITEM. Si se encuentra, realice la acción adecuada.

Debe estar preparado para buscar un elemento que coincida con la información que proporciona el control de vista de lista. Debe devolver el índice del elemento si se ejecuta correctamente o -1 si no se encuentra ningún elemento coincidente.

Consulte también

Uso de CListCtrl
Controles