Controles de lista virtual
Um controle de lista virtual é um controle de exibição de lista que tem o LVS_OWNERDATA estilo.Esse estilo permite ao controle oferecer suporte a uma contagem de item até um DWORD (somente amplia a contagem de item padrão para um int). No entanto, a maior vantagem fornecida por este estilo é a capacidade de ter apenas um subconjunto de itens de dados na memória por vez.Isso permite que o controle de modo de exibição de lista virtual dar-se para uso com grandes bancos de dados de informações, onde métodos específicos de acesso aos dados já estiverem no lugar certo.
Observação: |
---|
Juntamente com o fornecimento da funcionalidade de lista virtual no CListCtrlO MFC também oferece a mesma funcionalidade na 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 no Windows SDK.
Manipulação de notificação LVN_GETDISPINFO
Controles de lista virtual mantêm informações sobre o item muito pouco.Exceto para a seleção do item e informações de foco, 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 manipular esta notificação.Isso pode ser concluído com com facilidade usando a janela Propriedades (consulte Mapeamento de mensagens para funções).O código resultante deve ser algo semelhante ao exemplo a seguir (em que CMyDialog proprietário do 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 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_TEXT O pszText membro deve ser preenchido.
LVIF_IMAGE O iImage membro deve ser preenchido.
LVIF_INDENT The iIndent membro deve ser preenchido.
LVIF_PARAM O lParam membro deve ser preenchido.
LVIF_STATE O estado membro deve ser preenchido.
Em seguida, você deve fornecer o texto que seja solicitado a estrutura.
O exemplo a seguir (retirada do corpo do manipulador de notificação para o controle de lista objeto) 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 listas cache e virtual
Como esse tipo de controle de lista destina-se grandes conjuntos de dados, é recomendável que você armazenar em cache dados do item solicitado para melhorar o desempenho de recuperação.A estrutura oferece 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 como preparar e manter um cache, consulte a seção Gerenciamento de cache do tópico controles de exibição de lista no Windows SDK.
Localizar itens específicos
The LVN_ODFINDITEM notificação de mensagem é enviada pelo controle de lista virtual quando um item de controle de lista específica precisa ser encontrado.A mensagem de notificação será enviada quando o controle de modo de exibição de lista recebe rápido acesso às chave ou quando ele recebe um LVM_FINDITEM mensagem.As informações de Pesquisar são enviadas na forma de um LVFINDINFO estrutura, que é um membro do NMLVFINDITEM estrutura.Manipular esta mensagem, substituindo o OnChildNotify função de sua lista de objeto de controle e dentro do corpo do manipulador, verifique se a LVN_ODFINDITEM mensagem.Se encontrado, executar a ação apropriada.
Você deve estar preparado para procurar um item que coincida com as informações fornecidas pelo controle de modo de exibição de lista.Se nenhum item coincidente for localizado, você deve retornar o índice do item se bem-sucedida, ou -1.