List View
선문 비트 22기
정재환
목 차
● List View Control ?
● Style
● Message
● Message (통보)
● List View Control 생성
● Column, Item
● Add Column
● Add Item
● Function
● List View 실습
● List View Control ?
여러 가지 면에서 리스트 박스(List Box) 표준 컨트롤과 유사하다. 리스트 박스가 가진 기능을 확장하여 좀 더 예쁘게, 그리고 더 많은 기능을 추가하여 만든 신형 컨트롤이라고 생각하면 된다
① 표 형식(table)의 2차원적인 정보를 보여주기에 알맞다.
리스트 박스가 문자열 하나로만 구성된 항목을 가지는 데 비해 리스트 뷰 컨트롤은
여러 가지 세부 항목을 가질 수 있다.
② 헤더 컨트롤을 이용한 세부 항목 구분
세부 정보의 위쪽에는 헤더 컨트롤이 있어 세부 항목들의 제목을 표시한다. 헤더 컨트롤의 경계를 드래그하면 각 컬럼의 크기를 변경할 수 있으면 헤더를 눌렀을 때 눌러진 헤더에 따라 특정한 동작을 하기도 한다. 탐색기의 경우 헤더 컨트롤을 누르면 눌러진 컬럼을 키로 사용하여 정렬 상태를 변경한다.
③ 이미지 출력을 손 쉽게 !
리스트 박스보다 더 쉽게 이미지 출력을 지원한다.
④ 4가지 보기 옵션
네 가지 보기 형태는 각각 큰 아이콘 보기, 작은 아이콘 보기, 목록보기, 자세히 보기이다.
● Style
▪ LVS_ICON : 큰 아이콘 보기
▪ LVS_SMALLICON : 작은 아이콘 보기
▪ LVS_LIST : 간단히 보기
▪ LVS_REPORT : 자세히 보기
● Message
LVM_INSERTCOLUMN : 새 컬럼을 추가한다.
wParam에 컬럼 인덱스, lParam에 LV_COLUMN 구조체의 포인터를 전달한다.
LVM_INSERTITEM : 새 항목을 추가한다.
lParam으로 그 포인터를 전달한다.
LVM_SETIMAGELIST : 리스트 뷰 컨트롤과 연결될 이미지 리스트를 지정한다.
lParam에 이미지 리스트의 핸들을 전달,
wParam에 이미지 리스트의 종류를 지정한다.
이미지 리스트의 종류로는 LVSIL_NORMAL, LVSIL_SMALL,
LVSIL_STATE 중 하나이다.
LVM_SETITEM : 항목의 속성을 변경한다.
lParam으로 LV_ITEM 구조체의 포인터를 전달한다.
LVM_DELETEITEM : 항목을 삭제한다.
wParam에 삭제할 항목의 인덱스를 전달한다.
LVM_DELETEALLITEMS : 모든 항목을 삭제한다.
LVM_GETITEM : 항목의 속성을 조사한다.
LVM_GETNEXTITEM : 조건에 맞는 항목을 조사한다.
● Message (통보)
: List View에 변화가 있을 때 WM_NOTIFY 메시지 전달
LVN_BEGINDRAG : 왼쪽 마우스 버튼으로 항목을 드래그하기 시작할 때 발생한다.
LVN_BEGINLABELEDIT : 레이블을 편집할 때 발생한다.
LVN_BEGINRDRAG : 오른쪽 마우스 버튼으로 항목을 드래그하기 시작할 때 발생.
LVN_COLUMNCLICK : 헤더 컨트롤이 클릭될 때 발생한다.
LVN_DELETEALLITEM : 리스트 뷰 컨트롤의 모든 항목이 삭제될 때 발생한다.
LVN_DELETEITEM : 한 항목이 삭제될 때 발생한다.
LVN_ENDLABELEDIT : 레이블 편집이 완료되었을 때 발생한다.
LVN_GETDISPINFO : 항목의 출력이나 정렬을 위한 정보를 부모 윈도우에게 요청.
LVN_INSERTITEM : 새로운 항목이 삽입될 때 발생한다.
LVN_ITEMCHANGED : 사용자가 다른 항목을 선택했을 때 발생한다.
LVN_ITEMCHANGING : 사용자가 다른 항목을 선택하려고 할 때 발생한다.
LVN_KEYDOWN : 리스트 뷰 컨트롤이 포커스를 가지고 있는 상태에서 키보드 입력이 있을 때 발생한다.
LVN_SETDISPINFO : 부모 윈도우가 정렬이나 출력을 위해 유지하고 있는 항목의
정보가 갱신되어야 함을 알린다.
NM_CLICK : 왼쪽 마우스 버튼으로 항목을 클릭했다.
NM_DBLCLK : 왼쪽 마우스 버튼으로 항목을 더블클릭했다.
NM_RCLICK : 오른쪽 마우스 버튼으로 항목을 클릭했다.
● List View Control 생성
▪ CreateWindow
CreateWindow(WC_LISTVIEW,NULL,옵션,….);
▪ Resource
● Column, Item
● Add Column
: LVCOLUMN 구조체에 헤더의 정보를 채운 뒤 LVM_INSERTCOLUMN 메시지 전송
typedef struct _LVCOLMN{
UINT mask; : 사용될 멤버 값 설정
int fmt; : 문자열의 정렬방법, 이미지 사용 여부
int cx; : 헤더의 폭
LPTSTR pszText; : 보여질 문자열
int cchTextMax; : 문자열의 크기
int iSubItem; : 연결될 항목
#if(_WIN32_IE>=0x0300) : IE의 버전(구 버전 이미지 사용불가)
int iImage; : 보여질 이미지
int iOrder; : 헤더의 순서
#endif
}LVCOLUMN,FAR*LPLVCOLUMN;
● Add Item
: LVITEM 구조체에 항목의 정보를 채운 뒤 LVM_INSERTITEM 메시지 전송
typedef struct _LVITEM{
UINT mask; : 사용될 멤버 값 설정
int iItem; : 항목의 Index 설정
int iSubItem; : 항목의 Column Index설정
UINT state; : 항목의 상태(focus, 선택 등)
UINT stateMask; : 상태를 설정
LPTSTR pszText; : 문자열(실제 내용)
int cchTextMax; : 문자열 길이
int iImage; :왼쪽에 보여질 이미지의 인덱스
LPARAM lParam; : 항목의 추가 저장공간
#if(_WIN32_IE>=0x0300)
int iIndent; : 들여쓰기
}LVITEM,FAR*LVITEM;
● Function
: 리스트 뷰 관련 매크로 함수들은 모두 ListView_ 로 시작되며 CommCtrl.h에 정의되어 있다.
ListView_GetItemCount() : 등록된 항목의 개수
ListView_InsertItem() : 새 항목 등록
ListView_SetItem() : 항목의 정보를 변경
ListView_SetItemTexT() : 항목의 문자열을 변경
ListView_DeleteItem() : 지정한 항목을 삭제
ListView_DeleteAllItems() : 전제 항목을 삭제
ListView_GetItemText() : 지정한 항목의 문자열을 얻어온다.
ListView_GetNextItem() : 옵션에 해당하는 항목의 인덱스 반환
ListView_FindItem() : 제시한 조건과 일치하는 항목의 인덱스 반환
ListView_SetItemState() : 지정한 항목의 상태 변경
● List View 실습
▼
▪ id와 password를 밑의 두 EditBox에 입력 받아 확인을 클릭하면 리스트 뷰에 등록됩니다.
▪ 변경버튼을 클릭하면 비밀번호가 “음냐뤼” 로 바뀌는 모습을 보여줍니다.
■ Source
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0 ,DlgProc);
}
void OnInit(HWND hDlg);
void OnCommand(HWND hDlg, WORD cid, WORD cmsg, HWND cWnd);
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch(iMessage)
{
case WM_INITDIALOG : OnInit(hDlg); return TRUE;
case WM_COMMAND : OnCommand(hDlg,LOWORD(wParam),HIWORD(wParam),(HWND)lParam); return TRUE;
}
return FALSE;
}
void AddColumn(HWND hList, wchar_t * colname, int index, int cx);
void OnInit(HWND hDlg)
{
HWND hList = GetDlgItem(hDlg, IDC_LIST1);
AddColumn(hList, TEXT("아이디"),0,100);
AddColumn(hList, TEXT("비밀번호"),1,200);
}
void AddColumn(HWND hList, wchar_t * colname, int index, int cx)
LVCOLUMN COL;
COL.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
COL.fmt = LVCFMT_LEFT;
COL.cx = cx;
COL.pszText = colname;
COL.iSubItem = index;
SendMessage(hList, LVM_INSERTCOLUMN, index, (LPARAM)&COL);
}
void ExitProc(HWND hDlg);
void OkProc(HWND hDlg);
void ChangeProc(HWND hDlg);
void AddMember(HWND hList, wchar_t *id, wchar_t *pw);
void OnCommand(HWND hDlg, WORD cid, WORD cmsg, HWND cWnd)
{
switch(cid)
{
case IDCANCEL : ExitProc(hDlg); break;
case IDOK : OkProc(hDlg); break;
case IDC_BUTTON1 : ChangeProc(hDlg); break;
}
}
void ExitProc(HWND hDlg)
{
EndDialog(hDlg, 0);
}
void OkProc(HWND hDlg)
{
wchar_t id[256+1];
wchar_t pw[256+1];
GetDlgItemText(hDlg, IDC_EDIT2, id, 256);
SetDlgItemText(hDlg, IDC_EDIT2, TEXT(""));
GetDlgItemText(hDlg, IDC_EDIT3, pw, 256);
SetDlgItemText(hDlg, IDC_EDIT3, TEXT(""));
AddMember(GetDlgItem(hDlg,IDC_LIST1),id,pw);
}
void ChangeProc(HWND hDlg)
{
ListView_SetItemText(GetDlgItem(hDlg, IDC_LIST1),0,1,TEXT("음냐뤼"));
}
void AddMember(HWND hList, wchar_t *id, wchar_t *pw)
{
LI.mask = LVIF_TEXT;
LI.iSubItem = 0;
LI.iItem = 0;
LI.pszText = id;
SendMessage(hList, LVM_INSERTITEM,0,(LPARAM)&LI);
LI.iSubItem=1;
LI.pszText = pw;
SendMessage(hList, LVM_SETITEM,0,(LPARAM)&LI);
}