Sdílet prostřednictvím


Ovládací prvky typu virtuální seznam

Ovládací prvek virtuálního seznamu je ovládací prvek zobrazení seznamu, který má styl LVS_OWNERDATA. Tento styl umožňuje ovládacímu prvku podporovat počet položek až do DWORD (výchozí počet položek se vztahuje pouze na hodnotu 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, aby se ovládací prvek zobrazení virtuálního seznamu pro použití s velkými databázemi informací, kde už existují konkrétní metody přístupu k datům.

Poznámka

Kromě poskytování virtuální seznam funkce v CListCtrl, MFC také poskytuje stejné funkce v CListView třídy.

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í prvky seznamu 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 oznámení 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 obslužné rutině zprávy LVN_GETDISPINFO oznámení musíte zkontrolovat, jaký typ informací se požaduje. Možné hodnoty:

  • LVIF_TEXT Člen pszText musí být vyplněn.

  • LVIF_IMAGE Člen iImage musí být vyplněn.

  • LVIF_INDENT Člen iIndent musí být vyplněn.

  • 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 jakékoli informace, které jsou požadovány zpět do architektury.

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é vyrovnávací paměti a obrázek 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;
}

ovládací prvky Ukládání do mezipaměti a 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í. Architektura poskytuje mechanismus nápovědy k mezipaměti, který pomáhá optimalizovat mezipaměť odesláním LVN_ODCACHEHINT oznámení.

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í prvky seznamu 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 . Zpracovat tuto zprávu přepsáním OnChildNotify funkce objektu ovládacího prvku seznamu a uvnitř těla obslužné rutiny zkontrolujte LVN_ODFINDITEM zprávu. 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žívání atributu CListCtrl
Ovládací prvky