虛擬清單控制項
虛擬清單控制項是具有LVS_OWNERDATA樣式的清單檢視控制項。 此樣式可讓控制項支援最多 DWORD 的專案計數(預設專案計數只會延伸至 int
)。 不過,此樣式提供的最大優點是一次只能有記憶體中資料項目的子集。 這可讓虛擬清單檢視控制項自行搭配大型資訊資料庫使用,其中特定存取資料的方法已經就緒。
注意
除了 在 中 CListCtrl
提供虛擬清單功能之外,MFC 也會在 CListView 類別中 提供相同的功能。
開發虛擬清單控制項時,您應該注意一些相容性問題。 如需詳細資訊,請參閱 Windows SDK 中 List-View Controls 主題的相容性問題一節。
處理LVN_GETDISPINFO通知
虛擬清單控制項會維護很少的專案資訊。 除了專案選取和焦點資訊之外,所有專案資訊都是由控制項的擁有者管理。 架構會透過LVN_GETDISPINFO通知訊息要求資訊。 若要提供要求的資訊,虛擬清單控制項的擁有者(或控制項本身)必須處理此通知。 這可以輕鬆地使用類別 精靈 來完成(請參閱 將訊息對應至函式 )。 結果程式碼看起來應該類似下列範例(其中 CMyDialog
擁有虛擬清單控制項物件,而對話方塊正在處理通知):
ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)
在LVN_GETDISPINFO通知訊息的處理常式中,您必須檢查要查看所要求的資訊類型。 可能的值是:
LVIF_TEXT
pszText 成員必須填入。LVIF_IMAGE
iImage 成員必須填入。LVIF_INDENT
iIndent 成員必須填入。LVIF_PARAM
lParam 成員必須填入。 (子專案不存在。LVIF_STATE
狀態 成員必須填入。
然後,您應該提供任何要求的資訊回到架構。
下列範例(取自清單控制項物件的通知處理常式本文)示範一個可能的方法,方法是提供專案的文字緩衝區和影像資訊:
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;
}
快取和虛擬清單控制項
由於這種類型的清單控制項適用于大型資料集,因此建議您快取要求的專案資料,以改善擷取效能。 架構提供快取提示機制,可藉由傳送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 中 List-View Controls 主題的快取管理一節。
尋找特定專案
需要找到特定清單控制項專案時,虛擬清單控制項會傳送LVN_ODFINDITEM通知訊息。 當清單檢視控制項收到快速金鑰存取或收到LVM_FINDITEM訊息時,就會傳送通知訊息。 搜尋資訊會以 LVFINDINFO 結構的形式 傳送,這是 NMLVFINDITEM 結構的成員 。 覆寫 OnChildNotify
清單控制項物件的函式,並在處理常式主體內檢查LVN_ODFINDITEM訊息,以處理此訊息。 如果找到,請執行適當的動作。
您應該準備好搜尋符合清單檢視控制項所提供資訊的專案。 如果成功,您應該傳回專案的索引,如果找不到相符的專案,則傳回 -1。