contrôles de liste virtuels
Un contrôle de liste virtuel est un contrôle de liste d'affichage qui contient le style de LVS_OWNERDATA. Ce style permet au contrôle de prendre en charge un nombre d'éléments jusqu'à DWORD (le nombre d'éléments par défaut s'étend uniquement à int). Toutefois, le plus grand avantage offert par ce style est la capacité d'avoir uniquement un sous-ensemble d'éléments de données en mémoire en même temps. Cela permet au contrôle de liste d'affichage virtuel de se prêter à utilisation avec de grandes bases de données d'informations, où les méthodes spécifiques d'accéder aux données sont déjà en place.
Notes
En plus de fournir des fonctionnalités de liste virtuelle dans CListCtrl, MFC fournit également la même fonctionnalité que la classe d' CListView.
Il existe des problèmes de compatibilité connus que vous devez connaître lors du développement des contrôles de liste virtuels. Pour plus d'informations, consultez la section des problèmes de compatibilité de la rubrique de contrôle d'affichage de liste dans Kit de développement logiciel Windows.
Gérer la notification de LVN_GETDISPINFO
Les contrôles de liste virtuels contiennent des très peu d'informations sur les éléments. Hormis la sélection d'éléments et l'information 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 les 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 facilement être effectuée à l'aide de la fenêtre Propriétés (voir Mapper des messages aux fonctions). Le code obtenu doit ressembler à quelque chose comme l'exemple suivant (où CMyDialog détient l'objet de 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 du message de notification de LVN_GETDISPINFO, vous devez voir quels types d'informations sont demandés. Les valeurs possibles sont :
LVIF_TEXT Le membre d' pszText doit être rempli.
LVIF_IMAGE Le membre d' iImage doit être rempli.
LVIF_INDENT Le membre iIndent doit être rempli.
LVIF_PARAM Le membre de lParam doit être rempli. (Pas présent pour les sous-articles.)
LVIF_STATE Le membre de l' état doit être rempli.
Vous devez alors fournir n'importe quelles informations demandées à l'infrastructure.
L'exemple suivant (pris du corps du gestionnaire de notification de l'objet de contrôle de liste) illustre une méthode possible en fournissant des informations sur les mémoires tampons de texte et 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;
}
La mise en cache et contrôles de liste virtuels
Étant donné que ce type de contrôle de liste est destiné à des jeux de données volumineux, il est recommandé de mettre en cache les données demandées d'élément pour améliorer les performances de récupération. L'infrastructure fournit un mécanisme de cache-hinting sans indication d'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 la préparation et entretien d'un cache, consultez la section " gestion du cache de la rubrique de contrôle d'affichage de liste 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 d'affichage de liste a un accès rapide principal ou lorsqu'il reçoit un message de LVM_FINDITEM. Les informations de recherche sont envoyées sous la forme d'une structure de LVFINDINFO, qui est membre de la structure de NMLVFINDITEM. Traitez ce message en substituant la fonction d' OnChildNotify de votre objet de contrôle de liste et à l'intérieur du corps du responsable, recherchez le message de LVN_ODFINDITEM. Le cas échéant, exécutez l'action appropriée.
Vous devez être prêt à rechercher un élément correspondant aux informations fournies par le contrôle d'affichage de liste. Vous devez retourner l'index de l'élément en cas de réussite, ou -1 si aucun élément correspondant n'a été trouvé.