Compartilhar via


Controles de lista virtual

Um controle de lista virtual é um controle de exibição de lista que tem o LVS_OWNERDATA estilo.Este estilo permite o controle suportar uma contagem de item até um DWORD (apenas estende a contagem de item padrão para um int).Entretanto, 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 justificando para uso com grandes bancos de dados de informações, onde métodos específicos de acesso a dados já estão no local.

ObservaçãoObservação

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

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

Manipulação a notificação LVN_GETDISPINFO

Controles de lista virtual mantêm informações de item muito pouco.Exceto para as informações de foco e seleção de item, todas as informações de item são gerenciadas pelo proprietário do controle.As informações são solicitadas pela estrutura por meio de um LVN_GETDISPINFO mensagem de notificação.Para fornecer as informações solicitadas, o proprietário do controle de lista virtual (ou o próprio controle) deve tratar essa notificação.Isso pode ser feito facilmente usando a janela Propriedades (consulte Mapeamento mensagens para funções).O código resultante deve ser algo como o exemplo a seguir (onde CMyDialog possui o objeto de controle de lista virtual e a caixa de diálogo é manipulação a notificação):

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

No manipulador para o LVN_GETDISPINFO mensagem de notificação, você deve verificar para ver que tipo de informação está sendo solicitado.Os valores possíveis são:

  • LVIF_TEXTO pszText membro deve ser preenchido.

  • LVIF_IMAGEO iImage membro deve ser preenchido.

  • LVIF_INDENT a iIndent membro deve ser preenchido.

  • LVIF_PARAMO lParam membro deve ser preenchido.(Não apresente para subitens.)

  • LVIF_STATEO estado membro deve ser preenchido.

Em seguida, você deve fornecer qualquer informação for solicitada a estrutura.

O exemplo a seguir (extraído 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);
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;
}

Controles de lista Virtual e cache

Porque esse tipo de controle de lista destina-se a grandes conjuntos de dados, recomenda-se o cache de dados do item solicitado para melhorar o desempenho de recuperação.O framework fornece um mecanismo de dicas de cache para ajudar a otimizar o cache, enviando um LVN_ODCACHEHINT mensagem de notificação.

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 a preparação e manutenção de um cache, consulte a seção Gerenciamento de Cache do tópico controles de exibição de lista de Windows SDK.

Localizando itens específicos

O LVN_ODFINDITEM mensagem de notificação é enviada pelo controle de lista virtual quando um item de controle de lista específica precisa ser encontrado.A mensagem de notificação é enviada quando o controle de exibição de lista recebe acesso rápido chave ou quando ele recebe um LVM_FINDITEM mensagem.Informações de pesquisa são enviadas na forma de um LVFINDINFO estrutura, que é membro da NMLVFINDITEM estrutura.Manipular esta mensagem, substituindo o OnChildNotify função da lista de controle de objeto e dentro do corpo do manipulador, verifique se o LVN_ODFINDITEM mensagem.Se encontrado, execute a ação apropriada.

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

Consulte também

Referência

Usando CListCtrl

Conceitos

Controles (MFC)