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.