Partilhar via


Controles de lista virtual

Um controle de lista virtual é um controle de exibição de lista que tem o estilo LVS_OWNERDATA. Esse estilo permite que o controle ofereça suporte a uma contagem de itens até um DWORD (a contagem de itens padrão só se estende a um int). No entanto, a maior vantagem proporcionada por este 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 preste para uso com grandes bancos de dados de informações, onde métodos específicos de acesso a dados já estão em vigor.

Observação

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

Há alguns problemas de compatibilidade 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 Controles de List-View no SDK do Windows.

Tratamento da notificação de LVN_GETDISPINFO

Os controles de lista virtual mantêm muito poucas informações sobre o item. Com exceção das informações de seleção e foco do item, todas as informações do item são gerenciadas pelo proprietário do controle. As informações são solicitadas pelo quadro através 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 manipular essa notificação. Isso pode ser feito facilmente usando o Assistente de classe (consulte Mapeando mensagens para funções). O código resultante deve ser semelhante ao exemplo a seguir (onde CMyDialog possui o objeto de controle de lista virtual e a caixa de diálogo está manipulando a notificação):

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

No manipulador da mensagem de notificação LVN_GETDISPINFO, você deve verificar que 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 campo iIndent tem de ser preenchido.

  • LVIF_PARAM O membro lParam deve ser preenchido. (Não presente para sub-itens.)

  • LVIF_STATE O Estado-membro deve ser preenchido.

Em seguida, deve fornecer as informações solicitadas de volta ao quadro.

O exemplo a seguir (retirado do corpo do manipulador de notificação para o objeto de controle de lista) demonstra um método possível fornecendo informações para os buffers de texto e 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 se destina a grandes conjuntos de dados, é recomendável armazenar em cache os dados do item solicitado para melhorar o desempenho da recuperação. A estrutura fornece um mecanismo de dica de cache para ajudar na otimização do cache enviando uma mensagem de notificação LVN_ODCACHEHINT.

O exemplo a seguir atualiza o cache com o intervalo que é passado para a função manipuladora.

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 Controles de List-View no SDK do Windows.

Localizando 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 é um membro da estrutura NMLVFINDITEM . Manipule essa mensagem fazendo override na função OnChildNotify do objeto de controlo de lista e, dentro do corpo do manipulador, verifique a mensagem LVN_ODFINDITEM. Se encontrado, execute a ação apropriada.

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

Ver também

Usando CListCtrl
Controlos