Sanal Liste Denetimleri
Sanal liste denetimi, LVS_OWNERDATA stiline sahip bir liste görünümü denetimidir. Bu stil, denetimin bir DWORD'e kadar öğe sayısını desteklemesini sağlar (varsayılan öğe sayısı yalnızca bir int
öğesine kadar uzanır). Ancak, bu stilin sağladığı en büyük avantaj, herhangi bir anda bellekte yalnızca bir veri öğelerinin alt kümesine sahip olma özelliğidir. Bu, sanal liste görünümü denetiminin belirli verilere erişme yöntemlerinin zaten mevcut olduğu büyük bilgi veritabanlarıyla kullanılmak üzere ödünç vermesine olanak tanır.
Dekont
içinde sanal liste işlevselliği CListCtrl
sağlamanın yanı sıra, MFC de CListView sınıfında aynı işlevselliği sağlar.
Sanal liste denetimleri geliştirirken bilmeniz gereken bazı uyumluluk sorunları vardır. Daha fazla bilgi için Windows SDK'sında Liste Görünümü Denetimleri konusunun Uyumluluk Sorunları bölümüne bakın.
LVN_GETDISPINFO Bildirimini İşleme
Sanal liste denetimleri çok az öğe bilgisi tutar. Öğe seçimi ve odak bilgileri dışında, tüm öğe bilgileri denetimin sahibi tarafından yönetilir. Bilgiler çerçeve tarafından bir LVN_GETDISPINFO bildirim iletisiyle istenir. İstenen bilgileri sağlamak için, sanal liste denetiminin (veya denetimin kendisinin) bu bildirimi işlemesi gerekir. Bu, Sınıf Sihirbazı kullanılarak kolayca yapılabilir (bkz. İletileri İşlevlere Eşleme). Sonuçta elde edilen kod aşağıdaki örneğe benzer olmalıdır ( CMyDialog
burada sanal liste denetim nesnesinin sahibidir ve iletişim kutusu bildirimi işler):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
LVN_GETDISPINFO bildirim iletisinin işleyicisinde, hangi tür bilgilerin istendiğini denetlemeniz gerekir. Olası değerler:
LVIF_TEXT
pszText üyesi doldurulmalıdır.LVIF_IMAGE
iImage üyesi doldurulmalıdır.LVIF_INDENT
iIndent üyesi doldurulmalıdır.LVIF_PARAM
lParam üyesi doldurulmalıdır. (Alt öğeler için mevcut değil.)LVIF_STATE
Eyalet üyesi doldurulmalıdır.
Daha sonra çerçeveye geri istenen bilgileri sağlamanız gerekir.
Aşağıdaki örnek (liste denetimi nesnesi için bildirim işleyicisinin gövdesinden alınan), bir öğenin metin arabellekleri ve görüntüsü için bilgi sağlayarak olası bir yöntemi gösterir:
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;
}
Önbelleğe Alma ve Sanal Liste Denetimleri
Bu tür bir liste denetimi büyük veri kümelerine yönelik olduğundan, alma performansını geliştirmek için istenen öğe verilerini önbelleğe almanızı öneririz. Çerçeve, bir LVN_ODCACHEHINT bildirim iletisi göndererek önbelleği iyileştirmeye yardımcı olacak bir önbellek ipucu mekanizması sağlar.
Aşağıdaki örnek, önbelleği işleyici işlevine geçirilen aralıkla güncelleştirir.
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;
}
Önbelleği hazırlama ve koruma hakkında daha fazla bilgi için Windows SDK'sında Liste Görünümü Denetimleri konusunun Önbellek Yönetimi bölümüne bakın.
Belirli Öğeleri Bulma
LVN_ODFINDITEM bildirim iletisi, belirli bir liste denetim öğesinin bulunması gerektiğinde sanal liste denetimi tarafından gönderilir. Bildirim iletisi, liste görünümü denetimi hızlı anahtar erişimi aldığında veya bir LVM_FINDITEM iletisi aldığında gönderilir. Arama bilgileri, NMLVFINDITEM yapısının bir üyesi olan LVFINDINFO yapısı biçiminde gönderilir. Liste denetim nesnenizin işlevini geçersiz kılarak OnChildNotify
bu iletiyi işleyin ve işleyicinin gövdesinde LVN_ODFINDITEM iletisini denetleyin. Bulunursa, uygun eylemi gerçekleştirin.
Liste görünümü denetimi tarafından verilen bilgilerle eşleşen bir öğeyi aramaya hazır olmanız gerekir. Başarılı olursa öğenin dizinini veya eşleşen öğe bulunamazsa -1 değerini döndürmelisiniz.