Virtuelle Listensteuerelemente
Ein virtuelles Listensteuerelement ist ein ListView-Steuerelement, das LVS_OWNERDATA Format hat. Dieses Format wird das Steuerelement aktiviert, um eine Elementanzahl bis DWORD zu unterstützen (die Standardelementanzahl erweitert nur bei int). Allerdings ist der größte Vorteil, der von diesem Stil bereitgestellt wird, die Möglichkeit, einer Teilmenge Datenelemente im Arbeitsspeicher nur zu jeder Zeit haben. Dies ermöglicht dem virtuellen ListView-Steuerelement, die für die Verwendung mit großen Datenbanken von Informationen zu leihen, in denen bestimmte Methoden zum Zugreifen auf Daten bereits gesorgt sind.
Hinweis
Neben der virtuellen Listenfunktionalität in CListCtrl, MFC stellt auch die gleiche Funktionalität in der Klasse CListView.
Es gibt mehrere Schnittstellen, die Sie beachten sollten, wenn Sie virtuelle Listensteuerelemente entwickeln. Weitere Informationen finden Sie den Kompatibilitätsproblemabschnitt des Listenansicht-Steuerelement-Themas in Windows SDK.
Behandeln der LVN_GETDISPINFO-Benachrichtigung
Virtuelle Listensteuerelemente behalten sehr wenig Elementinformationen bei. Neben der Element-Auswahl und den Fokuseninformationen werden alle Elementinformationen vom Besitzer des Steuerelements verwaltet. Informationen werden durch das 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 einfach durchgeführt werden (siehe Zuordnungs-Meldungen auf Funktionen). Der resultierende Code sollte etwa wie das folgende Beispiel aussehen (wobei CMyDialog das Objekt des virtuellen Listensteuerelements 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, um anzuzeigen, welcher Typ von Informationen angefordert wird. Mögliche Werte sind:
LVIF_TEXT der Member muss pszText gefüllt werden.
LVIF_IMAGE der Member muss iImage gefüllt werden.
LVIF_INDENT der iIndent -Member muss gefüllt werden.
LVIF_PARAM der lParam -Member muss gefüllt werden. (Nicht für Unterelemente vorhanden.)
LVIF_STATE der Zustandsmember muss gefüllt werden.
Sie sollten dann angeben, welche Informationen zurück zum Framework angefordert werden.
Das folgenden Beispiel (erstellt aus dem Text des Benachrichtigungshandlers für das Listensteuerelementobjekt) wird eine andere Methode, indem 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 vorgesehen ist, wird empfohlen, angeforderte Elementdaten zwischenspeichern, um Abrufleistung zu verbessern. Das Framework stellt einen Cache-Andeutungsmechanismus der Vorlage im Optimieren des Cache dem Senden einer Benachrichtigung LVN_ODCACHEHINT bereit.
Im folgenden Beispiel wird der Cache mit dem Bereich, der an die Handlerfunktion zu ü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 Cache, finden Sie den Cache-Verwaltungsabschnitt des Listenansicht-Steuerelement-Themas in Windows SDK.
Suchen bestimmter Elemente
LVN_ODFINDITEM Die Benachrichtigung wird vom virtuellen Listensteuerelement gesendet, wenn ein bestimmtes Listensteuerelementelement gefunden werden muss. Die Benachrichtigung wird gesendet, sofern das ListView-Steuerelement Kurztastenzugriff empfängt, oder wenn es eine Meldung empfängt. LVM_FINDITEM Sucheninformationen werden in Form einer LVFINDINFO-Struktur gesendet, die ein Member der NMLVFINDITEM-Struktur ist. Bearbeiten Sie diese Meldung, indem Sie die OnChildNotify-Funktion des Listensteuerelementobjekts und -inneres der Text des Handlers, überprüfen Sie die Meldung LVN_ODFINDITEM überschreiben. Wenn Sie gefunden werden, führen Sie die entsprechende Aktion aus.
Sie sollten darauf vorbereitet sein, für ein Element, das die Informationen übereinstimmt, die durch das ListView-Steuerelement angegeben werden. Sie sollten den Index des Elements, wenn erfolgreich oder -1 zurück, wenn kein entsprechendes Element gefunden wird.