Virtuelle Listensteuerelemente

Ein virtuelles Listensteuerelement ist ein ListView-Steuerelement, das das LVS_OWNERDATA Format aufweist.Dieser Stil kann das Steuerelement eine Elementanzahl bis zu DWORD zu unterstützen (die Elementanzahl erweitert sich nur auf int).Allerdings ist der größte Vorteil, der von diesem Format bereitgestellt wird, die Fähigkeit, eine Teilmenge der Datenelemente in einer beliebigen Zeitpunkt nur im Arbeitsspeicher vorhanden sein.Dies ermöglicht es dem virtuellen Listenansicht-Steuerelement, die für die Verwendung mit großen Datenbanken von Informationen zu leihen, in denen bestimmte Methoden des Zugreifens von Daten bereits gesorgt sind.

HinweisHinweis

Zusätzlich zur Bereitstellung der virtuellen Listen, CListCtrl-Funktionen in MFC stellt außerdem die gleiche Funktionalität in der CListView-Klasse.

Es gibt mehrere Kompatibilitätsprobleme, die Sie beachten sollten, wenn Sie virtuelle Listensteuerelemente entwickeln.Weitere Informationen finden Sie im Abschnitt Kompatibilitätsproblem des Listenansicht-Steuerelement-Themas in Windows SDK.

Die Behandlung LVN_GETDISPINFO-Benachrichtigung

Virtuelle Listensteuerelemente behalten sehr wenig Elementinformationen bei.Neben dem die Auswahl von Elementen und den Elementinformationen werden alle Informationen über den Fokus vom Besitzer des Steuerelements verwaltet.Informationen werden vom Framework über eine LVN_GETDISPINFO Benachrichtigung angefordert.Um die erforderlichen Informationen bereitstellen, müssen der Besitzer des virtuellen Listensteuerelements (oder das Steuerelement selbst) diese Benachrichtigung bearbeiten.Dies kann mithilfe des Eigenschaftenfensters problemlos durchgeführt werden (siehe Zuordnungs-Meldungen Funktionen).Der resultierende Code sollte in etwa dem folgenden Beispiel aussehen (wobei CMyDialog das Objekt vom virtuellen Listensteuerelements besitzt und das Dialogfeld die Benachrichtigung) behandelt:

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

Im Handler für die LVN_GETDISPINFO Benachrichtigungsmeldung, müssen Sie überprüfen, um zu ermitteln, welcher Typ von Informationen angefordert wird.Mögliche Werte sind:

  • LVIF_TEXT der pszText-Member muss eingetragen werden.

  • LVIF_IMAGE der iImage-Member muss eingetragen werden.

  • LVIF_INDENT der iIndent -Member muss eingetragen werden.

  • LVIF_PARAM der lParam -Member muss eingetragen werden.(Nicht für Unterelemente vorhanden).

  • LVIF_STATE der Zustandsmember ausgefüllt werden muss.

Sie sollten dann angeben, welche Informationen im Framework angefordert werden.

Im folgenden Beispiel wird ausgeführt (Benachrichtigung vom Text des handlers für das Listensteuerelement Objekt) wird eine beliebige Methode, indem Sie Informationen für die Textpuffer und das Bild eines Elements angibt:

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

Zwischenspeichern und virtuelle Listensteuerelemente

Da dieser Typ des Listensteuerelements für große Datasets bestimmt ist, wird empfohlen, angeforderte Elementdaten zwischenspeichern, um die Leistung zu verbessern. AbrufenDas Framework stellt einen Mechanismus zur CACHE-Andeutungs der Vorlage im Optimieren des Caches aus dem Senden einer LVN_ODCACHEHINT Benachrichtigungsmeldung bereit.

Das folgende Beispiel aktualisiert den Cache mit dem Bereich, der der Handlerfunktion übergeben wird.

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

Weitere Informationen zum Vorbereiten und Verwalten eines Caches finden Sie im Abschnitt Cache-Verwaltungs des Listenansicht-Steuerelement-Themas in Windows SDK.

Bestimmte Elemente durchsuchen

Die LVN_ODFINDITEM Benachrichtigung wird durch das virtuelle Listensteuerelement gesendet, wenn ein bestimmtes Element im Listensteuerelement, das gesucht werden soll.Die Benachrichtigung gesendet wird, wenn das Listenansicht-Steuerelement Kurztasten Zugriff erhält, oder wenn eine LVM_FINDITEM Meldung empfängt.Sucht Informationen werden in Form einer LVFINDINFO-Struktur übermittelt, die ein Member der NMLVFINDITEM-Struktur ist.Bearbeiten Sie diese Nachricht, indem Sie die OnChildNotify-Funktion des Listensteuerelements - Objekts und der Text innerhalb eines Handlers, der für die Überprüfung LVN_ODFINDITEM Meldung überschreiben.Wenn Sie festgestellt wurden, führen Sie die entsprechende Aktion aus.

Sie sollten darauf vorbereitet sein, nach einem Element zu suchen, das die Informationen entspricht, die durch das Listenansicht-Steuerelement angegeben sind.Sie sollten den Index des Elements, wenn erfolgreich oder -1 (null) zurück, wenn kein übereinstimmendes Element gefunden wurde.

Siehe auch

Referenz

Verwenden von CListCtrl

Konzepte

Steuerelemente (MFC)