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 |