CAFE

[Win32API][22기 정재환] ListView 기술 문서

작성자[22기]정재환|작성시간11.08.12|조회수754 목록 댓글 0

 

 

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)

{

           LVITEM LI;

           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);

}

 

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼