티스토리 뷰
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] = { 100, 150, 150 };
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, 0, 1, L"수원시");
ListView_SetItemText(hListCtrl, 0, 2, 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 |