Freigeben über


Virtuelle Listensteuerelemente

Ein virtuelles Listen-Steuerelement ist ein Listenansicht-Steuerelement, das den Stil LVS_OWNERDATA hat. Mit diesem Stil kann die Steuerung eine Anzahl von Elementen bis zu einem DWORD unterstützen (die Standardanzahl reicht nur bis zu einem int). Der größte Vorteil dieses Stils besteht jedoch darin, jeweils nur eine Teilmenge von Datenelementen im Arbeitsspeicher zu haben. Auf diese Weise kann sich das Steuerelement für die virtuelle Listenansicht für die Verwendung mit großen Informationsdatenbanken eignen, bei denen bestimmte Methoden für den Zugriff auf Daten bereits vorhanden sind.

Hinweis

Zusätzlich zur Bereitstellung virtueller Listenfunktionen in CListCtrl, bietet MFC auch die gleiche Funktionalität in der CListView-Klasse .

Es gibt einige Kompatibilitätsprobleme, die Sie beim Erstellen virtueller Listensteuerelemente beachten sollten. Weitere Informationen finden Sie im Abschnitt "Kompatibilitätsprobleme" des Themas "List-View Steuerelemente" im Windows SDK.

Behandlung der LVN_GETDISPINFO-Benachrichtigung

Steuerelemente für virtuelle Listen behalten nur sehr wenig Elementinformationen bei. Mit Ausnahme der Elementauswahl- und Fokusinformationen werden alle Elementinformationen vom Besitzer des Steuerelements verwaltet. Informationen werden vom Framework über eine LVN_GETDISPINFO-Benachrichtigung angefordert. Um die angeforderten Informationen bereitzustellen, muss der Besitzer des virtuellen Listensteuerelements (oder des Steuerelements selbst) diese Benachrichtigung behandeln. Dies kann ganz einfach mithilfe des Klassen-Assistenten erfolgen (siehe Zuordnen von Nachrichten zu Funktionen). Der resultierende Code sollte etwa wie im folgenden Beispiel aussehen (wobei CMyDialog das virtuelle Listensteuerobjekt besitzt und das Dialogfeld die Benachrichtigung behandelt):

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

Im Handler für die LVN_GETDISPINFO-Benachrichtigung müssen Sie überprüfen, welche Art von Informationen angefordert werden sollen. Mögliche Werte sind:

  • LVIF_TEXT Das pszText-Element muss ausgefüllt werden.

  • LVIF_IMAGE Das iImage-Element muss ausgefüllt sein.

  • LVIF_INDENTDas iIndent-Mitglied muss ausgefüllt werden.

  • LVIF_PARAMDas lParam-Mitglied muss ausgefüllt werden. (Bei Unterpositionen nicht vorhanden.)

  • LVIF_STATE Der Mitgliedstaat muss ausgefüllt werden.

Anschließend sollten Sie alle erforderlichen Informationen an das Framework zurückgeben.

Das folgende Beispiel (aus dem Hauptteil des Benachrichtigungshandlers für das Listensteuerelementobjekt) veranschaulicht eine mögliche Methode, indem es Informationen für die Textpuffer und das Bild eines Elements zur Verfügung stellt.

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

Zwischenspeichern und Steuerelemente für virtuelle Listen

Da dieser Listensteuerelementtyp für große Datasets vorgesehen ist, wird empfohlen, angeforderte Elementdaten zwischenzuspeichern, um die Abrufleistung zu verbessern. Das Framework bietet einen Cachehinweismechanismus, mit dem der Cache optimiert werden kann, indem eine LVN_ODCACHEHINT-Benachrichtigung gesendet wird.

Im folgenden Beispiel wird der Cache mit dem Bereich aktualisiert, der an die 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 "Cacheverwaltung" des Themas "List-View Steuerelemente" im Windows SDK.

Suchen nach bestimmten Elementen

Die LVN_ODFINDITEM-Benachrichtigung wird vom virtuellen Listensteuerelement gesendet, wenn ein bestimmtes Listenelement gefunden werden muss. Die Benachrichtigung wird gesendet, wenn das Listenansichtssteuerelement Schnelltastenzugriff erhält oder wenn es eine LVM_FINDITEM Nachricht empfängt. Suchinformationen werden in Form einer LVFINDINFO-Struktur gesendet, die mitglied der NMLVFINDITEM-Struktur ist. Behandeln Sie diese Nachricht, indem Sie die OnChildNotify Funktion Ihres Listensteuerobjekts überschreiben, und suchen Sie im Text des Handlers nach der Nachricht LVN_ODFINDITEM. Wenn gefunden, führen Sie die entsprechende Aktion aus.

Sie sollten darauf vorbereitet sein, nach einem Element zu suchen, das den vom Listenansichtssteuerelement angegebenen Informationen entspricht. Sie sollten den Index des Elements zurückgeben, wenn erfolgreich, oder -1, wenn kein übereinstimmendes Element gefunden wird.

Siehe auch

Verwenden von CListCtrl
Steuerung