Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 a 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 seja usado 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 funcionalidade de lista virtual no CListCtrl, o 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.
Tratar a notificação LVN_GETDISPINFO
Os controles de lista virtual mantêm poucas informações de item. Com exceção das informações de seleção e foco do 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 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 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á lidando com a notificação):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
No manipulador da mensagem de notificação LVN_GETDISPINFO, você deve verificar para ver qual tipo de informação está sendo solicitada. Os valores possíveis são:
LVIF_TEXTO membro pszText deve ser preenchido.LVIF_IMAGEO membro iImage deve ser preenchido.LVIF_INDENTO membro iIndent deve ser preenchido.LVIF_PARAMO membro lParam deve ser preenchido. (Não está presente para subitens.)LVIF_STATEO membro state deve ser preenchido.
Em seguida, você deve fornecer todas as informações solicitadas de volta à estrutura.
O exemplo a seguir (obtido 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 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 da 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 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 é 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 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ê deverá retornar o índice do item se tiver êxito ou -1 se nenhum item correspondente for encontrado.