次の方法で共有


仮想リスト コントロール

仮想リスト コントロールは 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_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)