Udostępnij za pośrednictwem


Wirtualne formanty listy

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

Oprócz udostępniania funkcji listy wirtualnej w programie CListCtrlMFC zapewnia również te same funkcje w klasie CListView .

Podczas opracowywania kontrolek listy wirtualnej należy pamiętać o niektórych problemach ze zgodnością. Aby uzyskać więcej informacji, zobacz sekcję Problemy ze zgodnością tematu Kontrolki widoku listy 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 wirtualnej kontrolki listy (lub samej kontrolki) musi obsłużyć to powiadomienie. 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_TEXT Należy wypełnić element członkowski pszText .

  • LVIF_IMAGE Element członkowski iImage musi być wypełniony.

  • LVIF_INDENT Należy wypełnić element członkowski iIndent .

  • LVIF_PARAM Należy wypełnić element członkowski lParam . (Brak elementów podrzędnych).

  • LVIF_STATE Członek państwa musi zostać wypełniony.

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

kontrolki Buforowanie i listy wirtualnej

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 udostępnia mechanizm podpowiedzi pamięci podręcznej, który ułatwia optymalizowanie pamięci podręcznej przez wysłanie komunikatu powiadomienia LVN_ODCACHEHINT.

Poniższy przykład aktualizuje pamięć podręczną z zakresem przekazanym do funkcji obsługi.

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 Kontrolki widoku listy 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 klucza 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, przesłaniając OnChildNotify funkcję obiektu kontrolki listy i wewnątrz treści programu 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. Jeśli element się powiedzie, lub -1, jeśli nie zostanie znaleziony pasujący element, należy zwrócić indeks elementu.

Zobacz też

Korzystanie z CListCtrl
Kontrolki