Condividi tramite


Controlli elenco virtuali

Un controllo elenco virtuale è un controllo visualizzazione elenco nello stile di LVS_OWNERDATA .Questo stile consente al controllo per supportare un conteggio di elementi fino a DWORD (il numero predefinito dell'elemento estendere solo a int).Tuttavia, il massimo vantaggio offerto da questo stile consente solo di disporre di un sottoinsieme di elementi di dati in memoria in qualsiasi momento.In questo modo il controllo visualizzazione elenco virtuale è presti da utilizzare con i database di grandi dimensioni di informazioni, dove i metodi specifici di accedere ai dati sono già presenti sul posto.

[!NOTA]

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

Esistono alcuni problemi di compatibilità da tenere presenti quando si sviluppano i controlli elenco virtuali.Per ulteriori informazioni, vedere la sezione dei problemi di compatibilità dell'argomento dei controlli di visualizzazione elenchi in Windows SDK.

Gestire la notifica di LVN_GETDISPINFO

I controlli elenco virtuali mantengono le informazioni parti dell'elemento.Fatta eccezione per la selezione di elementi e le informazioni di stato attivo, tutte le informazioni dell'elemento vengono gestite dal proprietario del controllo.Le informazioni richieste da framework tramite un messaggio di notifica di LVN_GETDISPINFO .Per fornire informazioni necessarie, il proprietario del controllo elenco virtuale (o il controllo stesso) deve gestire la notifica.Questa operazione può essere effettuata utilizzando la Finestra Proprietà (vedere Messaggi del mapping delle funzioni).Il codice risultante dovrebbe essere analogo al seguente esempio (dove CMyDialog possiede l'oggetto del controllo elenco virtuale e la finestra di dialogo gestisce la notifica):

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

Nel gestore del messaggio di notifica di LVN_GETDISPINFO , è necessario controllare il tipo di informazioni vengono richiedende.I valori possibili sono:

  • LVIF_TEXT il membro di pszText deve essere soddisfatta.

  • LVIF_IMAGE il membro di iImage deve essere soddisfatta.

  • LVIF_INDENT il membro iIndent deve essere soddisfatta.

  • LVIF_PARAM il membro lParam deve essere soddisfatta.(Non memorizzato per gli sottomarino-elementi).

  • LVIF_STATE il membro di stato deve essere soddisfatta.

È quindi necessario fornire le informazioni necessarie per il framework.

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

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

La memorizzazione nella cache e controlli elenco virtuali

Poiché questo tipo di controllo elenco ha lo scopo di grandi quantità di dati, si consiglia di memorizzare nella cache è stato chiesto dei dati dell'elemento per migliorare le prestazioni di recupero.Il framework fornisce un meccanismo di suggerimento di supporto per ottimizzare la cache inviando un messaggio di notifica di LVN_ODCACHEHINT .

Nell'esempio aggiorna la cache con l'intervallo passato alla funzione di gestione.

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 ulteriori informazioni sulla preparazione e sulla gestione della cache, vedere la sezione di gestione della cache dei controlli di visualizzazione elenchi in Windows SDK.

Trovare elementi specifici

Il messaggio di notifica di LVN_ODFINDITEM viene inviato dal controllo elenco virtuale quando un particolare elemento del controllo elenco deve essere in inglese).Il messaggio di notifica viene inviato al controllo elenco riceve l'accesso rapido della chiave o quando riceve un messaggio di LVM_FINDITEM .Le informazioni presenti vengono inviati sotto forma di struttura di LVFINDINFO , che è un membro della struttura di NMLVFINDITEM .Gestire questo messaggio eseguendo l'override della funzione di OnChildNotify dell'oggetto e interno del controllo elenco il corpo del gestore, controllare il messaggio di LVN_ODFINDITEM .Se presente, eseguire l'azione appropriata.

È necessario prevedere trovare un elemento che corrisponde alle informazioni fornite dal controllo visualizzazione elenco.È necessario restituire il valore dell'elemento in caso di esito positivo, oppure -1 se non viene rilevato alcun elemento corrispondente.

Vedere anche

Riferimenti

Utilizzando CListCtrl

Concetti

Controlli (MFC)