Condividi tramite


Controlli List virtuali

Un controllo elenco virtuale è un controllo visualizzazione elenco con lo stile LVS_OWNERDATA. Questo stile consente al controllo di supportare un conteggio di elementi fino a una DWORD (il conteggio predefinito degli elementi si estende solo a un ).int Tuttavia, il vantaggio maggiore offerto da questo stile è la possibilità di avere solo un subset di elementi di dati in memoria in qualsiasi momento. Ciò consente al controllo visualizzazione elenco virtuale di prestarsi per l'uso con database di grandi dimensioni di informazioni, in cui sono già presenti metodi specifici per l'accesso ai dati.

Nota

Oltre a fornire funzionalità di elenco virtuale in CListCtrl, MFC fornisce anche la stessa funzionalità nella classe CListView .

Quando si sviluppano controlli elenco virtuali, è necessario tenere presente alcuni problemi di compatibilità. Per altre informazioni, vedere la sezione Problemi di compatibilità dell'argomento Controlli visualizzazione elenco in Windows SDK.

Gestione della notifica LVN_GETDISPINFO

I controlli elenco virtuale mantengono pochissime informazioni sugli elementi. Ad eccezione della selezione dell'elemento e delle informazioni sullo stato attivo, tutte le informazioni sugli elementi vengono gestite dal proprietario del controllo. Le informazioni vengono richieste dal framework tramite un messaggio di notifica LVN_GETDISPINFO. Per fornire le informazioni richieste, il proprietario del controllo elenco virtuale (o del controllo stesso) deve gestire questa notifica. Questa operazione può essere eseguita facilmente tramite la Creazione guidata classi (vedere Mapping dei messaggi alle funzioni). Il codice risultante dovrebbe avere un aspetto simile all'esempio seguente (dove CMyDialog possiede l'oggetto controllo elenco virtuale e la finestra di dialogo gestisce la notifica):

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

Nel gestore per il messaggio di notifica LVN_GETDISPINFO è necessario verificare il tipo di informazioni richieste. I valori possibili sono:

  • LVIF_TEXT Il membro pszText deve essere compilato.

  • LVIF_IMAGE Il membro iImage deve essere compilato.

  • LVIF_INDENT Il membro iIndent deve essere compilato.

  • LVIF_PARAM Il membro lParam deve essere compilato. Non presente per gli elementi secondari.

  • LVIF_STATE Il membro dello stato deve essere compilato.

È quindi necessario specificare le informazioni richieste al framework.

Nell'esempio seguente (tratto dal corpo del gestore di notifica per l'oggetto controllo elenco) viene illustrato un metodo possibile fornendo informazioni per i buffer di testo e l'immagine di un elemento:

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

Memorizzazione nella cache e controlli elenco virtuale

Poiché questo tipo di controllo elenco è destinato a set di dati di grandi dimensioni, è consigliabile memorizzare nella cache i dati degli elementi richiesti per migliorare le prestazioni di recupero. Il framework fornisce un meccanismo di hint per la cache per facilitare l'ottimizzazione della cache inviando un messaggio di notifica LVN_ODCACHEHINT.

Nell'esempio seguente la cache viene aggiornata con l'intervallo passato alla funzione del gestore.

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

Per altre informazioni sulla preparazione e la gestione di una cache, vedere la sezione Gestione cache dell'argomento Controlli visualizzazione elenco in Windows SDK.

Ricerca di elementi specifici

Il messaggio di notifica LVN_ODFINDITEM viene inviato dal controllo elenco virtuale quando è necessario trovare una particolare voce di controllo elenco. Il messaggio di notifica viene inviato quando il controllo visualizzazione elenco riceve l'accesso rapido alla chiave o quando riceve un messaggio di LVM_FINDITEM. Le informazioni di ricerca vengono inviate sotto forma di struttura LVFINDINFO , che è un membro della struttura NMLVFINDITEM . Gestire questo messaggio eseguendo l'override della OnChildNotify funzione dell'oggetto controllo elenco e all'interno del corpo del gestore, verificare la presenza del messaggio di LVN_ODFINDITEM. Se trovato, eseguire l'azione appropriata.

È necessario essere pronti a cercare un elemento che corrisponda alle informazioni specificate dal controllo visualizzazione elenco. Se l'elemento ha esito positivo, deve essere restituito l'indice oppure -1 se non viene trovato alcun elemento corrispondente.

Vedi anche

Uso di CListCtrl
Controlli