Contrôles de liste virtuels
Un contrôle de liste virtuelle est un contrôle d’affichage de liste qui a le style LVS_OWNERDATA. Ce style permet au contrôle de prendre en charge un nombre d’éléments jusqu’à un DWORD (le nombre d’éléments par défaut s’étend uniquement à un int
). Toutefois, le plus grand avantage fourni par ce style est la possibilité d’avoir un sous-ensemble d’éléments de données en mémoire à tout moment. Cela permet au contrôle d’affichage de liste virtuelle de se prêter à une utilisation avec de grandes bases de données d’informations, où des méthodes spécifiques d’accès aux données sont déjà en place.
Remarque
En plus de fournir des fonctionnalités de liste virtuelle dans CListCtrl
, MFC fournit également les mêmes fonctionnalités dans la classe CListView .
Vous devez connaître certains problèmes de compatibilité lors du développement de contrôles de liste virtuelle. Pour plus d’informations, consultez la section Problèmes de compatibilité de la rubrique Contrôles d’affichage de liste dans le Kit de développement logiciel (SDK) Windows.
Gestion de la notification LVN_GETDISPINFO
Les contrôles de liste virtuelle conservent très peu d’informations sur les éléments. À l’exception des informations de sélection et de focus de l’élément, 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 LVN_GETDISPINFO. Pour fournir les informations demandées, le propriétaire du contrôle de liste virtuelle (ou le contrôle lui-même) doit gérer cette notification. Cette opération peut facilement être effectuée à l’aide de l’Assistant Classe (voir Mappage des messages aux fonctions). Le code résultant doit ressembler à l’exemple suivant (où CMyDialog
possède l’objet de contrôle de liste virtuelle 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 LVN_GETDISPINFO, vous devez case activée pour voir quel type d’informations est demandé. Les valeurs possibles sont les suivantes :
LVIF_TEXT
Le membre pszText doit être renseigné.LVIF_IMAGE
Le membre iImage doit être renseigné.LVIF_INDENT
Le membre iIndent doit être renseigné.LVIF_PARAM
Le membre lParam doit être renseigné. (Non présent pour les sous-éléments.)LVIF_STATE
Le membre de l’état doit être renseigné.
Vous devez ensuite fournir les informations demandées au framework.
L’exemple suivant (extrait du corps du gestionnaire de notification pour l’objet de contrôle de liste) illustre 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);
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;
}
Mise en cache et contrôles de liste virtuelle
Étant donné que ce type de contrôle de liste est destiné aux jeux de données volumineux, il est recommandé de mettre en cache les données d’élément demandées pour améliorer les performances de récupération. L’infrastructure fournit un mécanisme d’indicateur de cache pour faciliter l’optimisation du cache en envoyant un message de notification LVN_ODCACHEHINT.
L’exemple suivant met à jour le cache avec la plage passée à la fonction de 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 la maintenance d’un cache, consultez la section Gestion du cache de la rubrique Contrôles d’affichage de liste dans le Kit de développement logiciel (SDK) Windows.
Recherche d’éléments spécifiques
Le message de notification LVN_ODFINDITEM est envoyé par le contrôle de liste virtuelle lorsqu’un élément de contrôle de liste particulier doit être trouvé. Le message de notification est envoyé lorsque le contrôle d’affichage de liste reçoit un accès à clé rapide ou lorsqu’il reçoit un message LVM_FINDITEM. Les informations de recherche sont envoyées sous la forme d’une structure LVFINDINFO , qui est membre de la structure NMLVFINDITEM . Gérez ce message en remplaçant la OnChildNotify
fonction de votre objet de contrôle de liste et à l’intérieur du corps du gestionnaire, case activée pour le message LVN_ODFINDITEM. Si vous le trouvez, effectuez l’action appropriée.
Vous devez être prêt à rechercher un élément qui correspond 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’est trouvé.