다음을 통해 공유


가상 목록 컨트롤

가상 목록 컨트롤은 LVS_OWNERDATA 스타일을 가진 목록 보기 컨트롤입니다. 이 스타일을 사용하면 컨트롤이 DWORD까지 항목 수를 지원할 수 있습니다(기본 항목 수는 int/>로만 확장됨). 그러나 이 스타일에서 제공하는 가장 큰 장점은 한 번에 메모리에 데이터 항목의 하위 집합만 가질 수 있다는 것입니다. 이렇게 하면 특정 데이터 액세스 방법이 이미 있는 대규모 정보 데이터베이스에서 사용할 수 있도록 가상 목록 보기 컨트롤을 사용할 수 있습니다.

참고 항목

MFC는 가상 목록 기능을 CListCtrl제공하는 것 외에도 CListView 클래스에서 동일한 기능을 제공합니다.

가상 목록 컨트롤을 개발할 때 알아야 할 호환성 문제가 있습니다. 자세한 내용은 Windows SDK의 목록 보기 컨트롤 항목의 호환성 문제 섹션을 참조하세요.

LVN_GETDISPINFO 알림 처리

가상 목록 컨트롤은 항목 정보를 거의 기본. 항목 선택 및 포커스 정보를 제외하고 모든 항목 정보는 컨트롤 소유자가 관리합니다. LVN_GETDISPINFO 알림 메시지를 통해 프레임워크에서 정보를 요청합니다. 요청된 정보를 제공하려면 가상 목록 컨트롤(또는 컨트롤 자체)의 소유자가 이 알림을 처리해야 합니다. 이 작업은 클래스 마법사사용하여 쉽게 수행할 수 있습니다(함수에 메시지 매핑 참조). 결과 코드는 다음 예제와 같이 표시됩니다(가상 목록 컨트롤 개체를 소유하고 대화 상자가 알림을 처리하는 경우 CMyDialog ).

ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST3, &CMyDialog::OnLvnGetdispinfoList3)

LVN_GETDISPINFO 알림 메시지의 처리기에서 요청되는 정보 유형을 확인하려면 검사 합니다. 가능한 값은 다음과 같습니다.

  • LVIF_TEXTpszText 멤버를 채워야 합니다.

  • LVIF_IMAGEiImage 멤버를 채워야 합니다.

  • LVIF_INDENTiIndent 멤버를 채워야 합니다.

  • LVIF_PARAMlParam 멤버를 채워야 합니다. 하위 항목에는 존재하지 않습니다.

  • 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의 목록 보기 컨트롤 항목의 캐시 관리 섹션을 참조하세요.

특정 항목 찾기

LVN_ODFINDITEM 알림 메시지는 특정 목록 컨트롤 항목을 찾을 필요가 있을 때 가상 목록 컨트롤에 의해 전송됩니다. 알림 메시지는 목록 보기 컨트롤이 빠른 키 액세스를 받거나 LVM_FINDITEM 메시지를 받을 때 전송됩니다. 검색 정보는 NMLVFINDITEM 구조체의 멤버인 LVFINDINFO 구조체의 형태로 전송됩니다. 목록 컨트롤 개체의 함수를 재정의하고 OnChildNotify 처리기의 본문 내에서 LVN_ODFINDITEM 메시지의 검사 이 메시지를 처리합니다. 발견된 경우 적절한 작업을 수행합니다.

목록 보기 컨트롤에서 제공하는 정보와 일치하는 항목을 검색할 준비가 되어 있어야 합니다. 성공하면 항목의 인덱스 또는 일치하는 항목이 없으면 -1을 반환해야 합니다.

참고 항목

CListCtrl 사용
컨트롤