仮想リスト コントロール
更新 : 2007 年 11 月
仮想リスト コントロールは、LVS_OWNERDATA スタイルを持つリスト ビュー コントロールです。このスタイルを使用すると、項目数を DWORD で表現できる値までサポートできます。既定では、項目数は int で表現できる値までです。このスタイルの最大の利点は、データ項目のサブセットだけを随時メモリに保存できるという点です。これにより、仮想リスト ビュー コントロールは、データにアクセスする方法が既に適切に確立されている大規模なデータベース情報を操作できます。
メモ : |
---|
CListCtrl で仮想リスト機能が提供されるだけでなく、MFC の、CListView クラスでも同じ機能が提供されます。 |
仮想リスト コントロールを開発するときには、互換性の問題を考慮する必要があります。詳細については、Windows SDK の「List-View Controls」の「Compatibility Issues」のトピックを参照してください。
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 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 の「List-View Controls」の「Cache Management」の項目を参照してください。
特定の項目の検索
特定のリスト コントロール項目を検索する必要がある場合、LVN_ODFINDITEM 通知メッセージが仮想リスト コントロールによって送信されます。リスト ビュー コントロールでクイック キー アクセスを受信するか、LVM_FINDITEM メッセージを受信すると、この通知メッセージが送信されます。検索情報は、NMLVFINDITEM 構造体のメンバである LVFINDINFO 構造体の形で送信されます。リスト コントロール オブジェクトの OnChildNotify 関数をオーバーライドしてこのメッセージを処理し、ハンドラの本体で LVN_ODFINDITEM メッセージを確認します。メッセージがあれば、適切なアクションを実行します。
リスト ビュー コントロールで指定した情報に一致する項目の検索を準備します。項目が見つかった場合はその項目のインデックスを返し、一致する項目がない場合は -1 を返します。