Virtuelle Listensteuerelemente
Ein virtuelles Listensteuerelement ist ein Listenansichtssteuerelement mit dem LVS_OWNERDATA Format. Mit dieser Formatvorlage kann das Steuerelement eine Elementanzahl bis zu einem DWORD unterstützen (die Standardelementanzahl erstreckt sich nur auf eine int
). Der größte Vorteil dieser Formatvorlage ist jedoch die Möglichkeit, 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 Entwickeln virtueller Listensteuerelemente beachten sollten. Weitere Informationen finden Sie im Abschnitt "Kompatibilitätsprobleme" des Themas "Listenansichtssteuerelemente" im Windows SDK.
Behandeln der LVN_GETDISPINFO Benachrichtigung
Steuerelemente für virtuelle Listen Standard nur sehr wenig Elementinformationen enthalten. 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 Listensteuerelementobjekt gehört und das Dialogfeld die Benachrichtigung verarbeitet):
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-Mitglied muss ausgefüllt werden.LVIF_INDENT
Das iIndent-Mitglied muss ausgefüllt werden.LVIF_PARAM
Das lParam-Mitglied muss ausgefüllt werden. (Für Unterelemente nicht vorhanden.)LVIF_STATE
Der Mitgliedstaat muss ausgefüllt werden.
Anschließend sollten Sie alle informationen angeben, die an das Framework zurückgefragt werden.
Das folgende Beispiel (aus dem Textkörper des Benachrichtigungshandlers für das Listensteuerelementobjekt) veranschaulicht eine mögliche Methode, indem Informationen für die Textpuffer und das Bild eines Elements bereitgestellt werden:
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 Standard Beibehalten eines Caches finden Sie im Abschnitt "Cacheverwaltung" des Themas "Listenansichtssteuerelemente" im Windows SDK.
Suchen nach bestimmten Elementen
Die LVN_ODFINDITEM Benachrichtigung wird vom virtuellen Listensteuerelement gesendet, wenn ein bestimmtes Listensteuerelementelement 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 des Listensteuerelementobjekts und innerhalb des Textkörpers des Handlers überschreiben, überprüfen Sie die LVN_ODFINDITEM Nachricht. 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 das Element erfolgreich war, oder -1, wenn kein übereinstimmende Element gefunden wird.