虛擬清單控制項
虛擬清單控制項是 [清單檢視控制項具有 LVS_OWNERDATA 樣式。 這個樣式讓控制項來支援最多的項目計數DWORD (預設值的項目計數只能擴充到int)。 不過,這種樣式所提供的最大優點是能夠一次只能有在記憶體中的資料項目的子集。 這可讓虛擬清單檢視控制項本身適用於大型的資料庫的資訊,來存取資料的特定方法已置於。
注意事項 |
---|
除了提供虛擬清單功能,在CListCtrl,MFC 也提供相同的功能,在 CListView 類別。 |
有一些您絕對值得的開發虛擬清單控制項時的相容性問題。 如需詳細資訊,請參閱相容性問題的部分中的清單檢視控制項主題Windows SDK。
處理 LVN_GETDISPINFO 告知
虛擬清單控制項維持非常少的項目資訊。 除了的項目選擇和焦點資訊中,所有的項目資訊是根據控制項的擁有者管理。 透過架構所要求的資訊 LVN_GETDISPINFO 通知訊息。 若要提供所要求的資訊,虛擬清單控制項 (或控制項本身) 的擁有者必須處理這個告知。 這可以輕鬆地完成使用 [屬性] 視窗 (請參閱訊息對應到函式)。 產生的程式碼應該類似下列的範例 (其中CMyDialog擁有虛擬清單控制項物件和對話方塊正在處理通知):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
在處理常式中的 LVN_GETDISPINFO 通知訊息時,您必須檢查所要求的資訊類型。 可能的值為:
LVIF_TEXTpszText成員都必須填寫。
LVIF_IMAGEiImage成員都必須填寫。
LVIF_INDENTiIndent 成員都必須填寫。
LVIF_PARAMLParam 成員都必須填寫。 (未顯示的子項目。)
LVIF_STATE狀態成員都必須填寫。
然後,您應該提供要求的資訊給架構。
下列範例 (取自清單控制項物件的通知處理常式的主體) 會示範一個可行的方法,藉著提供文字暫存區和影像的項目:
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;
}
快取和虛擬清單控制項
由於這種類型的清單控制項要用於大型資料集,因此建議您快取要求的項目資料,以改善擷取效能。 此架構提供快取提示的機制,來協助您最佳化快取藉由傳送 LVN_ODCACHEHINT 通知訊息。
下列範例會更新快取區傳送到處理常式函式的範圍。
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;
}
如需有關準備和維護快取的詳細資訊,請參閱 [快取區管理] 區段中的清單檢視控制項主題的Windows SDK。
尋找特定的項目
LVN_ODFINDITEM 需要,請參閱特定的清單控制項項目時,虛擬清單控制項便會傳送通知訊息。 當清單檢視控制項收到按鍵的快速存取,或接收時傳送通知訊息 LVM_FINDITEM 訊息。 搜尋資訊的形式傳送 LVFINDINFO 結構,這是屬於成員的 NMLVFINDITEM 結構。 藉由覆寫處理此訊息OnChildNotify清單的函式控制物件,以及內部處理常式的主體,檢查是否有 LVN_ODFINDITEM 訊息。 如果找到,請執行適當的動作。
您應該準備好尋找符合清單檢視控制項所提供的資訊項目。 如果找不到符合的項目,您應該傳回的項目,如果成功的話,則為-1 的索引。