Contrôles de liste virtuels
Un contrôle de liste virtuel est un contrôle liste view qui utilise un style de LVS_OWNERDATA .Ce style permet au contrôle pour prendre en charge un nombre d'éléments jusqu'à DWORD (le nombre d'éléments par défaut étend uniquement à int).Toutefois, le plus grand avantage fourni par ce style est la capacité à avoir un sous-ensemble d'éléments de données en mémoire en même temps.Cela permet au contrôle liste view virtuel pour vous prêter à utiliser avec des bases de données volumineuses plus d'informations, où des méthodes spécifiques d'accéder aux données sont déjà en place.
[!REMARQUE]
En plus de fournir des fonctionnalités virtuelle de liste dans CListCtrl, MFC fournit également la même fonctionnalité dans la classe de CListView .
Il existe quelques problèmes de compatibilité que vous devez connaître lorsque vous développez des contrôles de liste virtuels.Pour plus d'informations, consultez la section des problèmes de compatibilité de la rubrique de contrôle liste view dans Kit de développement logiciel Windows.
Gérer la notification de LVN_GETDISPINFO
Les contrôles de liste virtuels contiennent que très peu d'élément.À l'exception de la sélection d'élément et les informations de focus, toutes les informations d'élément sont gérées par le propriétaire du contrôle.Les informations sont demandées par l'infrastructure via un message de notification de LVN_GETDISPINFO .Pour fournir des informations demandées, le propriétaire du contrôle de liste virtuel (ou le contrôle lui-même) doit traiter cette notification.Cela peut être facilement faire dans la fenêtre Propriétés (consultez Mapper les messages aux fonctions).Le code obtenu doit se présenter comme dans l'exemple suivant (où CMyDialog possède l'objet contrôle de liste virtuel et la boîte de dialogue gère la notification) :
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
Dans le gestionnaire pour le message de notification de LVN_GETDISPINFO , vous devez vérifier le type d'informations est demandé.Les valeurs possibles sont :
LVIF_TEXT le membre d' pszText doit être exécuté.
LVIF_IMAGE le membre d' iImage doit être exécuté.
LVIF_INDENT le membre iIndent doit être exécuté.
LVIF_PARAM le membre de lParam doit être exécuté.(Pas présent pour des sous-éléments.)
LVIF_STATE le membre d'état doit être exécuté.
Vous devez fournir ensuite toute informations sont demandées dans l'infrastructure.
L'exemple suivant (extraits du corps du gestionnaire de notification pour l'objet contrôle de liste) présente une méthode possible en fournissant des informations pour les mémoires tampons de texte et l'image d'un élément :
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;
}
Mettre en cache et contrôles de liste virtuels
Comme ce type de contrôle liste est prévu pour les grands groupes de données, il est recommandé de mettre en cache les données demandées d'élément pour améliorer les performances de récupération.La structure fournit un mécanisme de cache-indication à l'aide en optimisant le cache en envoyant un message de notification de LVN_ODCACHEHINT .
l'exemple suivant met à jour le cache avec la plage passée à la fonction gestionnaire.
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;
}
Pour plus d'informations sur préparer et gérer un cache, consultez la section gestion du cache de la rubrique de contrôle liste view dans Kit de développement logiciel Windows.
Rechercher des éléments spécifiques
Le message de notification de LVN_ODFINDITEM est envoyé par le contrôle de liste virtuel lorsqu'un élément particulier de contrôle de liste doit être trouvé.Le message de notification est envoyé lorsque le contrôle liste view reçoit l'accès principal rapide ou lorsqu'il reçoit un message de LVM_FINDITEM .Les informations de recherche sont envoyées sous la forme de structure de LVFINDINFO , qui est un membre de la structure de NMLVFINDITEM .Traitez ce message en substituant la fonction d' OnChildNotify de votre objet et contrôle de liste le corps du gestionnaire, contrôle pour le message de LVN_ODFINDITEM .S'il le trouve, exécutez l'action appropriée.
Vous devez vous attendre à rechercher un élément qui correspond aux informations acheminées par le contrôle liste view.Vous devez retourner l'index de l'élément en cas de réussite, ou -1 si aucun élément correspondant n'est trouvé.