Ovládací prvky virtuálních seznamů

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_IMAGE Položka iImage musí být vyplněna.

  • LVIF_INDENT Polož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.

Viz také

Použití atributu CListCtrl
Ovládací prvky