Controlli List virtuali
Un controllo elenco virtuale è un controllo di visualizzazione elenco che presenta lo stile LVS_OWNERDATA. Questo stile consente al controllo di supportare un numero di elementi fino a DWORD (il numero predefinito dell'elemento si estende solo a int). Tuttavia, il massimo vantaggio offerto da questo stile è la possibilità di disporre solo di elementi di un sottoinsieme di dati in memoria in qualsiasi momento. In questo modo il controllo elenco virtuale si presterà ad essere utilizzato con grandi database di informazioni, dove i metodi specifici di accesso ai dati sono già presenti sul posto.
Nota
Oltre a fornire funzionalità di elenco virtuale in CListCtrl, MFC fornisce inoltre la stessa funzionalità nella classe 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 LVN_GETDISPINFO
I controlli elenco virtuali conservano pochissime informazioni dell'elemento. Fatta eccezione per la selezione dell'elemento e le informazioni sullo stato attivo, tutte le informazioni sull'elemento vengono gestite dal proprietario del controllo. Le informazioni vengono richieste dal framework tramite un messaggio di notifica LVN_GETDISPINFO. Per fornire le informazioni necessarie, il proprietario del controllo elenco virtuale (o il controllo stesso) dovrà gestire la notifica. Questa operazione può essere effettuata utilizzando la Finestra Proprietà (vedere Mapping di messaggi a funzioni). Il codice risultante deve essere simile all'esempio seguente (dove CMyDialog è il proprietario dell'oggetto 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 LVN_GETDISPINFO, è necessario controllare il tipo di informazioni che vengono richieste. I valori possibili sono:
LVIF_TEXT Il membro pszText deve essere popolato.
LVIF_IMAGE Il membro iImage deve essere popolato.
LVIF_INDENT Il membro iIndent deve essere popolato.
LVIF_PARAM Il membro lParam deve essere popolato. (Non disponibile per gli elementi secondari).
LVIF_STATE Il membro state deve essere popolato.
È quindi necessario fornire le informazioni necessarie al framework.
Nell'esempio seguente (ricavato dal corpo del gestore di notifica per l'oggetto del controllo elenco) viene illustrato un metodo possibile per 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;
}
Memorizzazione nella cache e controlli elenco virtuali
Poiché questo tipo di controllo elenco è destinato a grandi quantità di dati, si consiglia di memorizzare nella cache i dati dell'elemento richiesto per migliorare le prestazioni di recupero. Il framework fornisce un meccanismo di suggerimento per l'ottimizzazione della cache inviando un messaggio di notifica LVN_ODCACHEHINT.
L'esempio seguente 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 gestione della cache dell'argomento dei controlli di visualizzazione elenchi in Windows SDK.
Trovare elementi specifici
Il messaggio di notifica LVN_ODFINDITEM viene inviato dal controllo elenco virtuale quando un particolare elemento del controllo elenco deve essere trovato. Il messaggio di notifica viene inviato quando il controllo elenco riceve l'accesso rapido alla chiave o quando riceve un messaggio LVM_FINDITEM. Le informazioni presenti vengono inviate sotto la forma della struttura LVFINDINFO, il quale è un membro della struttura NMLVFINDITEM. Gestire questo messaggio eseguendo l'override della funzione OnChildNotify dell'oggetto controllo elenco e all'interno del corpo del gestore, controllare il messaggio LVN_ODFINDITEM. Se trovato, eseguire l'azione appropriata.
È necessario essere pronti a cercare 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.