Bagikan melalui


Kontrol Daftar Virtual

Kontrol daftar virtual adalah kontrol tampilan daftar yang memiliki gaya LVS_OWNERDATA. Gaya ini memungkinkan kontrol untuk mendukung jumlah item hingga DWORD (jumlah item default hanya meluas ke int). Namun, keuntungan terbesar yang diberikan oleh gaya ini adalah kemampuan untuk hanya memiliki subset item data dalam memori kapan saja. Ini memungkinkan kontrol tampilan daftar virtual untuk meminjamkan dirinya sendiri untuk digunakan dengan database informasi besar, di mana metode tertentu untuk mengakses data sudah ada.

Catatan

Selain menyediakan fungsionalitas daftar virtual di CListCtrl, MFC juga menyediakan fungsionalitas yang sama di kelas CListView .

Ada beberapa masalah kompatibilitas yang harus Anda ketahui saat mengembangkan kontrol daftar virtual. Untuk informasi selengkapnya, lihat bagian Masalah Kompatibilitas dari topik Kontrol Tampilan Daftar di Windows SDK.

Menangani Pemberitahuan LVN_GETDISPINFO

Kontrol daftar virtual mempertahankan informasi item yang sangat sedikit. Kecuali untuk pilihan item dan informasi fokus, semua informasi item dikelola oleh pemilik kontrol. Informasi diminta oleh kerangka kerja melalui pesan pemberitahuan LVN_GETDISPINFO. Untuk memberikan informasi yang diminta, pemilik kontrol daftar virtual (atau kontrol itu sendiri) harus menangani pemberitahuan ini. Ini dapat dengan mudah dilakukan menggunakan Panduan Kelas (lihat Memetakan Pesan ke Fungsi). Kode yang dihasilkan akan terlihat seperti contoh berikut (di mana CMyDialog memiliki objek kontrol daftar virtual dan dialog menangani pemberitahuan):

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

Di handler untuk pesan pemberitahuan LVN_GETDISPINFO, Anda harus memeriksa untuk melihat jenis informasi apa yang diminta. Nilai yang mungkin adalah:

  • LVIF_TEXT Anggota pszText harus diisi.

  • LVIF_IMAGE Anggota iImage harus diisi.

  • LVIF_INDENT Anggota iIndent harus diisi.

  • LVIF_PARAM Anggota lParam harus diisi. (Tidak ada untuk sub-item.)

  • LVIF_STATE Anggota negara bagian harus diisi.

Anda kemudian harus memberikan informasi apa pun yang diminta kembali ke kerangka kerja.

Contoh berikut (diambil dari isi penangan pemberitahuan untuk objek kontrol daftar) menunjukkan satu metode yang mungkin dengan menyediakan informasi untuk buffer teks dan gambar item:

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

Penembolokan dan Kontrol Daftar Virtual

Karena jenis kontrol daftar ini ditujukan untuk himpunan data besar, disarankan agar Anda menyimpan data item yang diminta cache untuk meningkatkan performa pengambilan. Kerangka kerja menyediakan mekanisme petunjuk cache untuk membantu mengoptimalkan cache dengan mengirim pesan pemberitahuan LVN_ODCACHEHINT.

Contoh berikut memperbarui cache dengan rentang yang diteruskan ke fungsi handler.

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

Untuk informasi selengkapnya tentang menyiapkan dan memelihara cache, lihat bagian Manajemen Cache dari topik Kontrol Tampilan Daftar di Windows SDK.

Menemukan Item Tertentu

Pesan pemberitahuan LVN_ODFINDITEM dikirim oleh kontrol daftar virtual ketika item kontrol daftar tertentu perlu ditemukan. Pesan pemberitahuan dikirim saat kontrol tampilan daftar menerima akses kunci cepat atau saat menerima pesan LVM_FINDITEM. Informasi pencarian dikirim dalam bentuk struktur LVFINDINFO , yang merupakan anggota struktur NMLVFINDITEM . Tangani pesan ini dengan menimpa OnChildNotify fungsi objek kontrol daftar Anda dan di dalam isi handler, periksa pesan LVN_ODFINDITEM. Jika ditemukan, lakukan tindakan yang sesuai.

Anda harus siap untuk mencari item yang cocok dengan informasi yang diberikan oleh kontrol tampilan daftar. Anda harus mengembalikan indeks item jika berhasil, atau -1 jika tidak ada item yang cocok yang ditemukan.

Baca juga

Menggunakan CListCtrl
Kontrol