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çã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.