Ovládací prvky typu virtuální seznam
Ovládací prvek seznam virtuálních je ovládací prvek seznamu zobrazení, který má LVS_OWNERDATA stylu.Tento styl umožňuje ovládací prvek pro podporu položka počtu až DWORD (výchozí počet položek se rozšíří pouze k int).Největší výhodou poskytované tento styl je však možnost pouze podmnožinu datových položek v paměti v kterémkoli okamžiku.To umožňuje ovládací prvek zobrazení virtuálního seznamu Chcete půjčit sám pro použití s rozsáhlými databázemi informací, kde zvláštní metody přístupu k datům jsou již na místě.
[!POZNÁMKA]
Kromě zajištění seznam virtuálních funkcí v CListCtrl, knihovna MFC poskytuje rovněž stejné funkce v CListView třídy.
Existují některé problémy s kompatibilitou, kterým je třeba věnovat pozornost při vývoji seznam virtuálních ovládacích prvků.Další informace naleznete v části potíže s kompatibilitou v tématu zobrazení seznamu ovládací prvky Windows SDK.
Zpracování oznámení LVN_GETDISPINFO
Ovládací prvky Seznam virtuálních udržovat jen velmi málo informací o zboží.Kromě výběru zboží a informace o zaměření spravuje všechny informace o položce vlastníka ovládacího prvku.Framework prostřednictvím žádá informace LVN_GETDISPINFO oznámení.Poskytnout požadované informace, musí vlastník ovládacího prvku seznam virtuálních (nebo ovládacího prvku) zpracovat toto oznámení.To lze snadno provést pomocí okna vlastnosti (viz Mapování zpráv do funkcí).Výsledný kód by měl vypadat jako v následujícím příkladu (kde CMyDialog vlastní objekt ovládacího prvku seznam virtuálních a zpracovává oznámení dialogové okno):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
V obslužné rutině LVN_GETDISPINFO oznámení, je třeba zkontrolovat, chcete-li zjistit, jaké informace jsou požadovány.Možné hodnoty:
LVIF_TEXTpszText Člen musí být vyplněno.
LVIF_IMAGEiImage Člen musí být vyplněno.
LVIF_INDENTiIndent člen musí být vyplněno.
LVIF_PARAMLParam člen musí být vyplněno. (Chybí pro dílčí položky.)
LVIF_STATEStav člen musí být vyplněno.
Potom zadejte jakékoli informace je požadována zpět do architektury.
Následující příklad (převzata z textu oznámení obslužnou rutinu pro ovládací prvek seznamu objekt) ukazuje jeden možný způsob poskytováním informací pro vyrovnávací paměti textu a obrázku položku:
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;
}
Ukládání do mezipaměti a virtuální ovládací prvky seznamu
Protože tento typ ovládacího prvku seznamu je určena pro rozsáhlé sady dat, je vhodné ukládat mezipaměti data požadovaná položka Chcete-li zlepšit výkon vyhledávání.Rozhraní framework poskytuje mechanismus mezipaměti psaní pomáhat při optimalizaci mezipaměti odesláním LVN_ODCACHEHINT oznámení.
V následujícím příkladu aktualizuje mezipaměť s rozsahem předaný obslužné rutiny.
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;
}
Další informace o přípravě a údržbu mezipaměti naleznete v části Správa mezipaměti v tématu zobrazení seznamu ovládací prvky Windows SDK.
Hledání konkrétních položek
LVN_ODFINDITEM oznámení odesílána pomocí ovládacího prvku seznam virtuálních dané položky ovládacího prvku je třeba nalézt.Oznámení je odeslána ovládací prvek zobrazení seznamu obdrží klíče rychlý přístup, nebo dostane-li LVM_FINDITEM zprávy.Hledání informací je odeslán v podobě LVFINDINFO strukturu, která je členem z NMLVFINDITEM struktury.Zpracování této zprávy přepsáním OnChildNotify funkce seznamu řízení objektu a uvnitř těla obslužné rutiny pro kontrolu LVN_ODFINDITEM zprávy.Pokud nalezen, proveďte odpovídající akci.
Byste měli být připraveni Hledat položku, která se shoduje s údaji uvedenými v ovládacím prvku seznamu zobrazení.Měli byste vrátit index položky v případě úspěchu nebo -1 Pokud není nalezena žádná odpovídající položka.