Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wirtualna kontrolka listy to kontrolka widoku listy, która ma styl LVS_OWNERDATA. Ten styl umożliwia kontrolce obsługę liczby elementów do DWORD (domyślna liczba elementów rozciąga się tylko na int). Jednak największą zaletą tego stylu jest możliwość posiadania tylko podzbioru elementów danych w pamięci jednocześnie. Dzięki temu kontrolka widoku listy wirtualnej może być używana z dużymi bazami danych informacji, w których istnieją już określone metody uzyskiwania dostępu do danych.
Uwaga / Notatka
Oprócz udostępniania funkcji listy wirtualnej w programie CListCtrlMFC zapewnia również te same funkcje w klasie CListView .
Należy pamiętać o pewnych problemach ze zgodnością podczas opracowywania kontrolek list wirtualnych. Aby uzyskać więcej informacji, zobacz sekcję Problemy ze zgodnością w temacie List-View Controls w zestawie Windows SDK.
Obsługa powiadomienia LVN_GETDISPINFO
Kontrolki listy wirtualnej zachowują bardzo mało informacji o elemencie. Z wyjątkiem informacji o zaznaczeniu elementu i fokusie wszystkie informacje o elemencie są zarządzane przez właściciela kontrolki. Informacje są żądane przez platformę za pośrednictwem komunikatu powiadomienia LVN_GETDISPINFO. Aby podać żądane informacje, właściciel kontrolki wirtualnej listy (lub sama kontrolka) musi zarządzać tym powiadomieniem. Można to łatwo zrobić za pomocą Kreatora klas (zobacz Mapowanie komunikatów na funkcje). Wynikowy kod powinien wyglądać podobnie do poniższego przykładu (gdzie CMyDialog jest właścicielem obiektu kontrolki listy wirtualnej, a okno dialogowe obsługuje powiadomienie):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
W procedurze obsługi komunikatu powiadomienia LVN_GETDISPINFO należy sprawdzić, jakiego typu informacje są żądane. Możliwe wartości to:
LVIF_TEXTNależy wypełnić składnik pszText.LVIF_IMAGEElement iImage musi być wypełniony.LVIF_INDENTNależy wypełnić pole iIndent.LVIF_PARAMCzłonek lParam musi być wypełniony. (Nieobecność dla podrzędnych elementów.)LVIF_STATEPole stan musi zostać wypełnione.
Następnie należy podać wszystkie żądane informacje z powrotem do platformy.
W poniższym przykładzie (pobranym z treści programu obsługi powiadomień dla obiektu kontrolki listy) przedstawiono jedną z możliwych metod, podając informacje dotyczące buforów tekstowych i obrazu elementu.
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;
}
Buforowanie i wirtualne sterowanie listą
Ponieważ ten typ kontrolki listy jest przeznaczony dla dużych zestawów danych, zaleca się buforowanie żądanych danych elementu w celu zwiększenia wydajności pobierania. Platforma zapewnia mechanizm wskazówek dotyczących pamięci podręcznej, który ułatwia optymalizację pamięci podręcznej poprzez wysłanie komunikatu powiadomienia LVN_ODCACHEHINT.
Poniższy przykład aktualizuje pamięć podręczną zakresem przekazywanym do funkcji obsługującej.
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;
}
Aby uzyskać więcej informacji na temat przygotowywania i obsługi pamięci podręcznej, zobacz sekcję Zarządzanie pamięcią podręczną w temacie List-View Controls w zestawie Windows SDK.
Znajdowanie określonych elementów
Komunikat powiadomienia LVN_ODFINDITEM jest wysyłany przez kontrolkę listy wirtualnej, gdy należy odnaleźć określony element kontrolki listy. Komunikat powiadomienia jest wysyłany, gdy kontrolka widoku listy odbiera szybki dostęp do klawiszy lub gdy odbiera komunikat LVM_FINDITEM. Informacje wyszukiwania są wysyłane w postaci struktury LVFINDINFO , która jest członkiem struktury NMLVFINDITEM . Obsłuż ten komunikat, nadpisując OnChildNotify funkcję w obiekcie kontrolki listy, a następnie w ramach treści procedury obsługi sprawdź komunikat LVN_ODFINDITEM. W przypadku znalezienia wykonaj odpowiednią akcję.
Należy przygotować się do wyszukiwania elementu zgodnego z informacjami podanymi przez kontrolkę widoku listy. Należy zwrócić indeks elementu, jeśli zostanie znaleziony, lub -1, jeśli nie znaleziono pasującego elementu.