Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Knihovna MFC (Microsoft Foundation Classes) se nadále podporuje. Už ale nepřidáme funkce ani aktualizujeme dokumentaci.
Ovládací prvek virtuálního seznamu je ovládací prvek zobrazení seznamu, který má styl LVS_OWNERDATA. Tento styl umožňuje, aby ovládací prvek podporoval počet položek až do hodnoty typu DWORD (výchozí počet položek je omezen pouze na int). Největší výhodou tohoto stylu je ale možnost mít v paměti pouze podmnožinu datových položek v paměti najednou. To umožňuje ovládacímu prvku zobrazení virtuálního seznamu se lépe hodit pro použití s velkými databázemi informací, kde jsou již zavedeny konkrétní metody pro přístup k datům.
Poznámka:
Kromě poskytování virtuální funkce seznamu v CListCtrl, MFC také poskytuje stejnou funkci ve třídě CListView.
Při vývoji ovládacích prvků virtuálních seznamů byste měli vědět o některých problémech s kompatibilitou. Další informace naleznete v části Problémy s kompatibilitou tématu ovládacích prvků List-View v sadě Windows SDK.
Zpracování oznámení LVN_GETDISPINFO
Virtuální ovládací prvky seznamu udržují velmi málo informací o položkách. Kromě výběru položky a informací o fokusu spravuje vlastník ovládacího prvku všechny informace o položce. Informace jsou požadovány rozhraním prostřednictvím LVN_GETDISPINFO oznamovací zprávy. Pokud chcete poskytnout požadované informace, musí vlastník ovládacího prvku virtuálního seznamu (nebo samotného ovládacího prvku) toto oznámení zpracovat. To lze snadno provést pomocí Průvodce třídou (viz mapování zpráv na funkce). Výsledný kód by měl vypadat přibližně jako v následujícím příkladu (kde CMyDialog vlastní objekt ovládacího prvku virtuálního seznamu a dialogové okno zpracovává oznámení):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
V proceduře obsluhy upozornění zprávy LVN_GETDISPINFO musíte zkontrolovat, jaký typ informací je požadován. Možné hodnoty:
LVIF_TEXTČlen pszText musí být vyplněn.LVIF_IMAGEPoložka iImage musí být vyplněna.LVIF_INDENTPoložka iIndent musí být vyplněna.LVIF_PARAMČlen lParam musí být vyplněn. (Pro dílčí položky není k dispozici.)LVIF_STATEČlenský stát musí být vyplněn.
Pak byste měli zadat do frameworku veškeré informace, které jsou požadovány.
Následující příklad (převzatý z textu obslužné rutiny oznámení pro objekt ovládacího prvku seznamu) ukazuje jednu možnou metodu poskytnutím informací pro textové buffer a obraz položky.
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;
}
Ukládání do mezipaměti a ovládací prvky virtuálního seznamu
Vzhledem k tomu, že tento typ ovládacího prvku seznamu je určený pro velké datové sady, doporučujeme ukládat požadovaná data položek do mezipaměti, aby se zlepšil výkon načítání. Rámec poskytuje nápovědní mechanismus pro mezipaměť, který pomáhá optimalizovat mezipaměť odesláním oznamovací zprávy LVN_ODCACHEHINT.
Následující příklad aktualizuje mezipaměť s rozsahem předaným funkci 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žbě mezipaměti najdete v části Správa mezipaměti tématu ovládacích prvků List-View v sadě Windows SDK.
Hledání konkrétních položek
Zpráva oznámení LVN_ODFINDITEM je odeslána ovládacím prvku virtuálního seznamu, když je potřeba najít konkrétní položku ovládacího prvku seznamu. Zpráva s oznámením se odešle, když ovládací prvek zobrazení seznamu obdrží rychlý přístup ke klíči nebo když obdrží LVM_FINDITEM zprávu. Vyhledávací informace se odesílají ve formě struktury LVFINDINFO , která je členem struktury NMLVFINDITEM . Přepište funkci OnChildNotify svého objektu ovládacího prvku seznamu, abyste ošetřili tuto zprávu, a v těle obslužné rutiny zkontrolujte zprávu LVN_ODFINDITEM. Pokud se najde, proveďte příslušnou akci.
Měli byste být připraveni vyhledat položku, která odpovídá informacím zadaným ovládacím prvku zobrazení seznamu. Pokud je položka úspěšná, měli byste vrátit index položky nebo -1, pokud nebyla nalezena žádná odpovídající položka.