Dela via


Kontroller för virtuell lista

En virtuell listkontroll är en listvykontroll som har stilen LVS_OWNERDATA. Med det här formatet kan kontrollen stödja ett antal objekt upp till ett DWORD (standardantalet för objekt utökas endast till int). Den största fördelen med det här formatet är dock möjligheten att bara ha en delmängd dataobjekt i minnet samtidigt. Detta gör att kontrollen för den virtuella listvyn kan användas med stora informationsdatabaser, där specifika metoder för att komma åt data redan finns.

Anmärkning

Förutom att tillhandahålla funktioner för virtuella listor i CListCtrltillhandahåller MFC även samma funktioner i klassen CListView .

Det finns vissa kompatibilitetsproblem som du bör känna till när du utvecklar kontroller för virtuella listor. Mer information finns i avsnittet Kompatibilitetsproblem i avsnittet List-View Controls i Windows SDK.

Hantera LVN_GETDISPINFO-meddelandet

Kontroller för virtuella listor behåller mycket lite objektinformation. Förutom objektval och fokusinformation hanteras all objektinformation av kontrollens ägare. Information begärs av ramverket via ett LVN_GETDISPINFO meddelandemeddelande. Om du vill ange den begärda informationen måste ägaren till den virtuella listkontrollen (eller själva kontrollen) hantera det här meddelandet. Detta kan enkelt göras med hjälp av klassguiden (se Mappa meddelanden till funktioner). Den resulterande koden bör se ut ungefär som i följande exempel (där CMyDialog äger kontrollobjektet för den virtuella listan och dialogrutan hanterar meddelandet):

ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)

I hanteraren för meddelandet LVN_GETDISPINFO måste du kontrollera vilken typ av information som begärs. Möjliga värden är:

  • LVIF_TEXT PszText-medlemmen måste fyllas i.

  • LVIF_IMAGE IImage-medlemmen måste fyllas i.

  • LVIF_INDENT iIndent-medlemmen måste fyllas i.

  • LVIF_PARAM LParam-medlemmen måste fyllas i. (Finns inte för underobjekt.)

  • LVIF_STATE Medlemsstaten måste fyllas i.

Du bör sedan ange den information som begärs tillbaka till ramverket.

I följande exempel (hämtat från meddelandehanterarens brödtext för listkontrollobjektet) visas en möjlig metod genom att ange information för textbuffertar och bild av ett objekt:

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;
}

Kontroller för cachelagring och virtuell lista

Eftersom den här typen av listkontroll är avsedd för stora datamängder rekommenderar vi att du cachelagrade begärda objektdata för att förbättra hämtningsprestandan. Ramverket tillhandahåller en mekanism för cachetips som hjälper dig att optimera cachen genom att skicka ett LVN_ODCACHEHINT meddelandemeddelande.

I följande exempel uppdateras cachen med intervallet som skickas till hanteringsfunktionen.

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;
}

Mer information om hur du förbereder och underhåller en cache finns i avsnittet Cachehantering i avsnittet List-View Controls i Windows SDK.

Hitta specifika objekt

Meddelandet LVN_ODFINDITEM skickas av den virtuella listkontrollen när ett visst listkontrollobjekt måste hittas. Meddelandemeddelandet skickas när listvisningskontrollen tar emot snabbnyckelåtkomst eller när den tar emot ett LVM_FINDITEM meddelande. Sökinformation skickas i form av en LVFINDINFO-struktur , som är medlem i NMLVFINDITEM-strukturen . Hantera det här meddelandet genom att åsidosätta funktionen för OnChildNotify listkontrollobjektet och i hanterarens brödtext söker du efter LVN_ODFINDITEM meddelandet. Utför lämplig åtgärd om det hittas.

Du bör vara beredd att söka efter ett objekt som matchar informationen som anges av listvisningskontrollen. Du bör returnera objektets index om det lyckas eller -1 om inget matchande objekt hittas.

Se även

Använda CListCtrl
Kontroller