Compartilhar via


Controles de lista virtuais

Um controle de lista virtual é um controle de exibição de lista que tem o estilo LVS_OWNERDATA. Esse estilo permite que o controle dê suporte a uma contagem de itens até um DWORD (a contagem de itens padrão se estende apenas até um int). No entanto, a maior vantagem fornecida por esse estilo é a capacidade de ter apenas um subconjunto de itens de dados na memória a qualquer momento. Isso permite que o controle de exibição de lista virtual se disponha ao uso com grandes bancos de dados de informações, em que métodos específicos de acesso a dados já estão em vigor.

Observação

Além de fornecer a funcionalidade de lista virtual em CListCtrl, o MFC também fornece a mesma funcionalidade na classe CListView.

Há alguns problemas de compatibilidade de que você deve estar ciente ao desenvolver controles de lista virtual. Para obter mais informações, consulte a seção Problemas de Compatibilidade do tópico Controle e exibição de lista do Windows.

Tratar a notificação LVN_GETDISPINFO

Os controles de lista virtual mantêm muito poucas informações de item. Exceto pelas informações de seleção e foco do item, todas as informações do item devem ser gerenciadas pelo proprietário do controle. As informações são solicitadas pela estrutura por meio de uma mensagem de notificação LVN_GETDISPINFO. Para fornecer as informações solicitadas, o proprietário do controle de lista virtual (ou o próprio controle) deve lidar com essa notificação. Isso pode ser feito facilmente usando o Assistente de classe (consulte Mapear mensagens para funções). O código resultante deve ser semelhante ao exemplo a seguir (em que CMyDialog é proprietário do objeto de controle de lista virtual, e a caixa de diálogo está tratando a notificação):

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

No manipulador da mensagem de notificação LVN_GETDISPINFO, você deve verificar qual tipo de informação está sendo solicitada. Os valores possíveis são:

  • LVIF_TEXT O membro pszText deve ser preenchido.

  • LVIF_IMAGE O membro iImage deve ser preenchido.

  • LVIF_INDENT O membro iIndent deve ser preenchido.

  • LVIF_PARAM O membro lParam deve ser preenchido. (Não está presente para subitens.)

  • LVIF_STATE O membro state deve ser preenchido.

Em seguida, você deve fornecer todas as informações solicitadas de volta à estrutura.

O exemplo a seguir (extraído do corpo do manipulador de notificações para o objeto de controle de lista) demonstra um método possível fornecendo informações para os buffers de texto e a imagem de um item:

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

Cache e controles de lista virtual

Como esse tipo de controle de lista destina-se a grandes conjuntos de dados, é recomendável armazenar em cache dados de item solicitados para melhorar o desempenho de recuperação. A estrutura fornece um mecanismo de dica de cache para ajudar a otimizar o cache enviando uma mensagem de notificação LVN_ODCACHEHINT.

O exemplo a seguir atualiza o cache com o intervalo passado para a função de manipulador.

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 obter mais informações sobre como preparar e manter um cache, consulte a seção Gerenciamento de Cache do tópico Controle e exibição de lista no SDK do Windows.

Localizar itens específicos

A mensagem de notificação LVN_ODFINDITEM é enviada pelo controle de lista virtual quando um item de controle de lista específico precisa ser encontrado. A mensagem de notificação é enviada quando o controle de exibição de lista recebe acesso rápido à chave ou quando recebe uma mensagem LVM_FINDITEM. As informações de pesquisa são enviadas na forma de uma estrutura LVFINDINFO, que é membro da estrutura NMLVFINDITEM. Manipule essa mensagem substituindo a função OnChildNotify do objeto de controle de lista e, dentro do corpo do manipulador, confira se a mensagem LVN_ODFINDITEM está presente. Se encontrada, execute a ação apropriada.

Você deve estar preparado para pesquisar um item que corresponda às informações fornecidas pelo controle de exibição de lista. Você deverá retornar o índice do item se tiver êxito, ou -1 se nenhum item correspondente for encontrado.

Confira também

Usando CListCtrl
Controles