티스토리 뷰

프로그래밍/API

ListView

에어버스 2016. 3. 19. 14:30

ListView

#include <commctrl.h>
#pragma comment(lib, "comctl32.lib") // Lib 추가

InitCommonControls(); // 공용컨트롤 초기화, WinMain() 클래스 등록 아래에 추가

를 추가한다.

- 이벤트처리

공용컨트롤은 WM_COMMAND 가 아닌 WM_NOTIFY 로 처리
wParam = 윈도우ID
lParam = NMHDR 구조체

typedef struct tagNMHDR {
  HWND 컨트롤윈도우핸들;
  UINT 컨트롤윈도우ID;
  UINT 이벤트값;
} NMHDR;

<이벤트값>
NM_CLICK
NM_DBCLICK
NM_SETFOCUS
NM_KILLFOCUS
NM_RETURN
NM_OUTOFMEMORY

- 컬럼(타이틀) 만들기

int ListView_InsertColumn(HWND 리스트핸들, int 컬럼번호, const LV_COLUMN FAR* 컬럼정보구조체 포인터)

typedef struct _LVCOLUMN {
  UINT 마스크;
  int 정렬플래그;
  int 컴럼폭;
  LPTSTR 컬럼문자열;
  int 컬럼문자열최대길이;
  int 컬럼번호;
} LVCOLUMN, *LPLVCOLUMN;

<마스크>
LVCF_FMT         컬럼플래그를 사용할 수 있게 한다           
LVCF_SUBITEM   컬럼번호를 사용할 수 있게한다
LVCF_TEXT        컬럼문자열을 가질 수 있게 한다
LV_CF_WIDTH    컬럼폭을 지정할 수 있게 한다     

<정렬플래그>
LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_CENTER

- 항목

type struct _LV_ITEM {
  UINT 마스크;
  int 항목(행)번호;
  int 컬럼(열)번호;
  UINT 상태; // 항목 새로 추가된 경우 값을 갖지않으나 컨트롤에 어떤 이벤트가 발생하면 정보를 얻을때 상태값에 따라 처리된다.
  UINT 상태마스크;
  LPTSTR 항목문자열;
  int 항목문자열최대길이;
  int 이미지번호;
  LPARAM 32비트현재구조체포인터;
} LV_ITEM;

- 항목에 컬럼정보 추가

VOID WINAPI ListView_SetItemText(HWND 리스트컨트롤핸들, int 행번호, int 컬럼번호, LPCSTR 문자열);

- 이미지 추가

HIMAGELIST WINAPI ImageList_LOadBitmap(HINSTANCE hInst, LPCSTR 이미지리스트포인터,
int 폭길이, int 공간작을때컨테이너확장단위, COLORREF 마스크색상);

- 이벤트처리 추가 (항목 선택하면 선택한 항목 표시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL CALLBACK ListCtrlProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_NOTIFY:
        if (wParam == IDC_LISTCRL)
        {
            pnmh = (LPNMHDR)lParam;
            switch (pnmh->code)
            {
            case LVN_ITEMCHANGED:
                pInfo = (LPNM_LISTVIEW)lParam;
                ListView_GetItemText(hListCtrl, pInfo->iItem, 0, szTemp, MAX_PATH);
                SetWindowText(GetDlgItem(hDlg, IDC_ITEMTEXT), szTemp);
                break;
            }
        }
        break;
 
cs

1. 항목 넣기
다이얼로그에 ListCtrl을 Report 형식으로 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <CommCtrl.h>
...
BOOL CALLBACK ListCtrlProc(HWND, UINT, WPARAM, LPARAM);
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 메뉴 선택을 구문 분석합니다.
            switch (wmId)
            {
            case ID_MENU_LISTCTRL:
                DialogBox(hInst, (LPWSTR)IDD_LISTCTRL, hWnd, ListCtrlProc);
                break;
....
}
 
TCHAR* ColList[3= { L"이름", L"주소", L"휴대폰" };
int nWidth[3= { 100150150 };
 
BOOL CALLBACK ListCtrlProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hListCtrl;
    LVCOLUMN col;
    LVITEM li;
    switch (msg)
    {
    case WM_INITDIALOG:
        hListCtrl = GetDlgItem(hDlg, IDC_LISTCRL);
        for (int i = 0; i < 3; i++)
        {
            col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
            col.fmt = LVCFMT_LEFT;
            col.cx = nWidth[i];
            col.pszText = ColList[i];
            col.iSubItem = 0;
            ListView_InsertColumn(hListCtrl, i, &col); // 컬럼(타이틀) 넣기
        }
        li.mask = LVIF_TEXT;
        li.state = 0;
        li.stateMask = 0;
        li.iImage = 0;
        li.iSubItem = 0;
        li.iItem = 0;
        li.pszText = L"가나";
        ListView_InsertItem(hListCtrl, &li); // 항목 추가
        ListView_SetItemText(hListCtrl, 01, L"수원시");
        ListView_SetItemText(hListCtrl, 02, L"031-123-4567");
        break;
    case WM_COMMAND:
        switch (wParam)
        {
        case IDOK:
        case IDCANCEL:
            EndDialog(hDlg, TRUE);
            return FALSE;
        }
        break;
    }
    return FALSE;
}
cs

2. 항목 동적 체크표시 및 체크표시 유무 검사하기

1
2
3
4
5
6
7
8
#include <Commctrl.h>
 
ListView_SetItemState(hListViewWnd, nItem, 0x1000 << 0, LVIS_STATEIMAGEMASK); // 항목 체크 해제
ListView_SetItemState(hListViewWnd, nItem, 0x1000 << 1, LVIS_STATEIMAGEMASK); // 항목 체크 하기
 
UINT un체크상태 = ListView_GetItemState(hListViewWnd, nItem, LVIS_STATEIMAGEMASK); // 항목의 상태값얻기
if(un체크상태 == 0x2000// 항목이 체크됨
if(un체크상태 == 0x1000// 항목이 체크 해제됨 ???
cs

3. 이벤트 처리 - WM_NOTIFY 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
BOOL CALLBACK ListCtrlProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    LPNMHDR pnmh;
    LPNM_LISTVIEW pInfo;
    switch (msg)
    {
    case WM_NOTIFY:
        if (wParam == IDC_LIST)
        {
            pnmh = (LPNMHDR)lParam;
            switch (pnmh->code)
            {
            case LVN_ITEMCHANGED: // 선택된 항목을 IDC_ITEMTEXT 에 출력한다
                pInfo = (LPNM_LISTVIEW)lParam;
                ListView_GetItemText(hListCtrl, pInfo->iItem, 0, szTemp, MAX_PATH);
                SetWindowText(GetDlgItem(hDlg, IDC_ITEMTEXT), szTemp);
                break;
            }
        }
        break;
 
cs
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31