次の方法で共有


仮想リスト コントロール

更新 : 2007 年 11 月

仮想リスト コントロールは、LVS_OWNERDATA スタイルを持つリスト ビュー コントロールです。このスタイルを使用すると、項目数を DWORD で表現できる値までサポートできます。既定では、項目数は int で表現できる値までです。このスタイルの最大の利点は、データ項目のサブセットだけを随時メモリに保存できるという点です。これにより、仮想リスト ビュー コントロールは、データにアクセスする方法が既に適切に確立されている大規模なデータベース情報を操作できます。

ye4z8x58.alert_note(ja-jp,VS.90).gifメモ :

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 を返します。

参照

概念

コントロール (MFC)

参照

CListCtrl の使い方