본문 바로가기

Windows

Virtual list control (리스트 아이템 가상화?)

https://msdn.microsoft.com/ko-kr/library/ye4z8x58.aspx

위 페이지에 잘 설명되어 있다. 뭐 일단 그렇고..


우선 이게 무엇을 하는 것인지 보자.

일단 virtual이라 해서 특별히 하는 것은 없다. 

기본적인 list control을 사용하는 방법에 약간의 차이를 둔 것이다. 

기본적으로 list item 추가할 때에는 InsertItem 함수 같은 기본 함수들을 이용하는데

이 함수를 이용하면 편하게 입력하고 삭제도 할 수 있다. 그런데 문제는 

list control 자체적으로 가질 수 있는 item의 양은 한계가 있을 것이고 문제는 추가 및 삭제할 때 

Control을 다시 그릴 때에도 많은 부하를 가질 수 있다.

그에 반해 virtual list는 자기가 그릴 item (현재 화면에 보여지는 영역의 item만.. ) 만 특정 함수를 통해 

받겠다는 얘기다. 그렇게 되면 빠른 속도록 data 입출력도 가능하고 리스트 컨트롤 자체의 부하도 줄일 수 있을테니.

그럼 어떻게 쓰느냐.. 

기본이 되는 것이 

LVN_GETDISPINFO  notify message이다.


BEGIN_MESSAGE_MAP(CTestDlg, CDialog)

//{{AFX_MSG_MAP(CTestDlg)

        ... 

ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST1, GetDispInfo)

        ...

//}}AFX_MSG_MAP

END_MESSAGE_MAP()


이런 식으로 message map에 연결하고 


void CTestDlg::OnGetdispinfoListAlertsLog(NMHDR *pNMHDR, LRESULT *pResult)

{

NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);

// TODO: Add your control notification handler code here

LV_ITEM* pItem = &(pDispInfo)->item;


LogItem row = m_arrLogs.at(pItem->iItem);


if (pItem->mask & LVIF_TEXT)

{

// then display the appropriate column

switch (pItem->iSubItem)

{

case 0:

{

CString str = row.time.Format(strTimeFormat);

_tcsncpy_s(pItem->pszText, pItem->cchTextMax, str, pItem->cchTextMax - 1);

}

break;

case 1: 

{

_tcsncpy_s(pItem->pszText, pItem->cchTextMax, row.text, pItem->cchTextMax - 1);

}

break;

default:

break;

}

}


if (pItem->mask & LVIF_IMAGE) {

// ...

}


*pResult = 0;

}


각 항목에 맞는 item을 설정하면 된다.


'Windows' 카테고리의 다른 글

[MFC] Draw Text  (0) 2016.05.27
MFC, Popup context menu  (0) 2016.05.11
Loading system icon  (0) 2016.04.20
MFC Control Focusing & Arraw Keys  (0) 2016.04.15
Visual Studio : DLL 경로, 환경변수 설정 방법  (0) 2014.06.19