次の方法で共有


仮想リスト コントロール

仮想リスト コントロールは LVS_OWNERDATA のスタイルがあるリスト ビュー コントロールです。 このスタイルは、コントロールが DWORD まで項目数をサポートすることができます (既定の項目の数が intのみ Extends)。 ただし、このスタイルによって提供される最も大きな利点はメモリのデータ項目のサブセットを一度に処理できるだけ機能です。 これは仮想一覧表示のコントロールがデータにアクセスする特定のメソッドが既に設定された情報の大きなデータベースで使用するために Loan ようにします。

注意

CListCtrlの仮想一覧の機能に加えて、MFC は、CListView クラスと同じ機能を提供します。

、注意が必要である互換性の問題があります仮想リスト コントロールを開発するとき。 詳細については、Windows SDKのリスト ビュー コントロールの互換性の問題セクションを参照します。

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メンバーは *、*入力する必要があります。

その後、どの情報をフレームワークが要求されるも提供する必要があります。

次の例では、リスト コントロール オブジェクトの通知ハンドラーの本体から取得した) 項目のテキスト バッファーとイメージの情報を指定して、1 とおりのメソッドを示しています。:

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 メッセージを受け取ったときに送信されます。 検索情報は NMLVFINDITEM の構造体のメンバーです LVFINDINFO 構造体の形式に渡されます。 リスト コントロール内のオブジェクトの OnChildNotify 関数をオーバーライドして、このメッセージを処理すれば内部は LVN_ODFINDITEM メッセージがハンドラーの本体、検証します。 見つかった場合、適切なアクションを実行します。

リスト ビュー コントロールによって提供される情報に一致する項目を検索するように準備する必要があります。 一致する項目がない場合、または -1 を成功した項目のインデックスを返す必要があります。

参照

関連項目

CListCtrl の使い方

概念

コントロール (MFC)