리스트 뷰는 컨트롤이 자체적으로 데이터를 관리한다. 그러나 메모리의 낭비가 생기고 데이터를 따로 관리해야
함으로 대량의 데이터를 관리할 경우에는 콜백 항목으로 데이터를 관리하는게 좋다.
콜백항목은 응용프로그램이 직접 리스트 뷰의 데이터를 소유하고 있다가 리스트 뷰가 출력 또는 정렬을 위해
데이터가 필요할 경우에만 데이터를 제공해 주는 형식을 말한다. 일괄적으로 데이터를 관리할 수 있다는 점과
메모리가 이중으로 낭비되지 않는다는 장점이 있다.
1-1 콜백항목의 추가
콜백항목을 사용하기 위해서는 일단 항목(아이템)을 추가 할 때 문자열은 LPSTR_TEXTCALLBACK 형식으로,
이미지는 I_IMAGECALLBACK 형식으로 추가를 하게 되면 콜백항목으로 등록이 된다.
ex)
LVITEM lvi;
lvi.mask = LVIF_TEXT; lvi.state = 0; lvi.stateMask = 0; lvi.iSubItem = 0; for (int i = 0; i < 5; i++) { lvi.iItem = i; lvi.pszText = LPSTR_TEXTCALLBACK; ListView_InsertItem(hListView,&lvi); ListView_SetItemText(hListView,i,1,LPSTR_TEXTCALLBACK); ListView_SetItemText(hListView,i,2,LPSTR_TEXTCALLBACK); ListView_SetItemText(hListView,i,3,LPSTR_TEXTCALLBACK); }
1-2 콜백항목의 데이터 처리
콜백항목으로 등록만 해서는 리스트 뷰에 데이터가 나타나지 않는다. 따로 처리를 해주어야 한다.
리스트 뷰에 데이터가 출력될 때 발생되는 통지 메세지는 LVN_GETDISPINFO 이다.
이 통지메세지에서 데이터를 처리해 주어야 비로소 리스트 뷰에 데이터가 나타나게 된다.
ex)
//리스트 뷰에 나타날 데이터 구조체
struct arrData{
TCHAR name[5];
TCHAR phonenum[14];
TCHAR address[30];
int age;
};
//리스트 뷰에 나타날 데이터
arrData phoneBook[5] = {
{L"하이1",L"010-2778-2451",L"어딘가에 살것지",20},
{L"하이2",L"010-0000-0000",L"하늘",1},
{L"하3",L"011-000-0000",L"천국",0},
{L"하4",L"11",L"지옥",100},
{L"하5",L"1",L"우리나라",59},
};
//WM_NOTIFY 메세지 처리 함수
BOOL OnNotify(HWND hwnd, WPARAM wParam, LPARAM lParam){
//메세지 처리를 위한 구조체 선언
LPNMHDR hdr = (LPNMHDR)lParam;
NMLVDISPINFO * ndi;
TCHAR str[256];
if(hdr->hwndFrom == hListView){
switch(hdr->code){
case LVN_GETDISPINFO:
ndi = (NMLVDISPINFO *)lParam;
if ((ndi->item.mask & LVIF_TEXT) == LVIF_TEXT)
{
switch(ndi->item.iSubItem){
case 0:
ndi->item.pszText = phoneBook[ndi->item.iItem].name;
break;
case 1:
_itow(phoneBook[ndi->item.iItem].age,str,10);
ndi->item.pszText = str;
break;
case 2:
ndi->item.pszText = phoneBook[ndi->item.iItem].phonenum;
break;
case 3:
ndi->item.pszText = phoneBook[ndi->item.iItem].address;
break;
}
}
break;
}
}
return FALSE;
}
WM_NOTIFY 메세지의 통지코드는 LVN_GETDISPINFO 이다. LVN_GETDISPINFO 메세지는 lParam값에
LVDISPINFO 구조체 정보를 넘겨준다. LVDISPINFO 참고 : http://blog.naver.com/nawoo/80104791418
이 구조체 멤버에는 LVITEM 구조체가 있어서 이 LVITEM 구조체의 정보를 참고하여 어떤 항목의 데이터가
필요한지 알아내고 원하는 데이터를 할당해 주는 구문이다.
1-3 콜백항목의 데이터 설정
데이터를 출력 했으면 입력된 데이터를 받아서 설정 할 수도 있어야 할것이다.
아이템의 데이터가 변경 되었을 때 발생되는 메세지는 LVN_SETDISPINFO 통지 메세지로
LVN_GETDISPINFO 메세지 처리를 할 경우와 비슷하게 처리를 해주며 다 처리를 한뒤에는
갱신을 위해 ListView_Update 함수를 호출하여 리스트 뷰를 다시 그려주면 된다.
댓글
댓글 쓰기