Aracılığıyla paylaş


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 CListCtrlsağ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_TEXTpszText üyesi doldurulmalıdır.

  • LVIF_IMAGEiImage üyesi doldurulmalıdır.

  • LVIF_INDENTiIndent üyesi doldurulmalıdır.

  • LVIF_PARAMlParam üyesi doldurulmalıdır. (Alt öğeler için mevcut değil.)

  • LVIF_STATEEyalet ü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.

Ayrıca bkz.

CListCtrl Kullanma
Denetimler