티스토리 뷰
트리컨트롤
1. 데이터 넣기
int TreeView_InsertItem(HWND 트리컨트롤핸들, TV_INSERTSTRUCT 트리구조체);
typedef struct _TV_INSERTSTRUCT {
HTREEITEM 부모트리아이템; // ROOT 지정, NULL인 경우 자신이 ROOT가 된다
HTREEITEM 자식트리아이템; // TVI_LAST 지정해서 트리 끝에 추가
TV_ITEM 아이템구조체;
} TV_INSERTSTRUCT, FAR* LPTV_INSERTSTRUCT;
<아이템구조체>
typedef struct _TV_ITEM {
UINT 구조체멤버선택마스크;
HTREEITEM 아이템고유번호;
UINT 상태;
UINT 상태마스크;
LPSTR 문자열;
int 문자열최대길이;
int 이미지번호;
int 선택했을때아이템에표시할이미지번호;
int cChildren;
int lParam;
} TV_ITEM, FAR* LPTV_ITEM;
<구조체멤버선택마스크>
TVIF_CHILDREN, TVIF_HANDLE, TVIF_IMAGE, TVIF_LPARAM, TVIF_SELECTEDIMAGE, TVIF_STATE,
TVIF_TEXT : 문자열과 최대문자열길이 값을 가질 수 있게 한다
- 이벤트 처리
WM_NOTIFY 메시지 발생
wParam = 해당컨트롤ID
lParam = 컨트롤 구조체(NMHDR) 포인터 (LPNMHDR)
구조체정보.code = 메시지
트리의 항목(item)을 클릭하면 클릭한 point 좌표를 hitinfo.pt 에 저장되고 TreeView_HitTest()를 통해 현재 클릭한 항목의 핸들을 얻으면 트리컨트롤 초기화 시 저장했던 핸들과 같은것을 찾아 문자열을 출력한다.
InitCommonControls(); 를 WinMain() 메시지루프 바로 앞에 추가해야 한다.
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 |
#include <CommCtrl.h>
#pragma comment(lib, "comctl32.lib")
BOOL CALLBACK TreeCtrlProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM 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_TREE:
DialogBox(hInst, MAKEINTRESOURCE(IDD_TREE), hWnd, TreeCtrlProc);
break;
...
BOOL CALLBACK TreeCtrlProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND hTree;
HTREEITEM ri, hi;
static HTREEITEM ti[7];
static TV_INSERTSTRUCT tvs[7];
static TCHAR* pil[7] = { L"VC++", L"ATL", L"CLR", L"일반", L"MFC", L"다른언어", L"C#" };
POINT pt;
TV_HITTESTINFO hitinfo;
TCHAR* it = NULL;
LPNMHDR pnmhdr;
ri = hi = NULL;
switch (msg)
{
case WM_INITDIALOG:
hTree = GetDlgItem(hDlg, IDC_TREE);
for (int i = 0; i < 7; i++)
{
tvs[i].hInsertAfter = TVI_LAST;
tvs[i].item.mask = TVIF_TEXT;
tvs[i].item.pszText = pil[i];
if (pil[i] == L"VC++" || pil[i] == L"다른언어")
{
tvs[i].hParent = NULL;
ri = TreeView_InsertItem(hTree, &tvs[i]);
ti[i] = ri;
}
else
{
tvs[i].hParent = ri;
hi = TreeView_InsertItem(hTree, &tvs[i]);
ti[i] = hi;
}
}
break;
case WM_NOTIFY:
if (wParam == IDC_TREE)
{
pnmhdr = (LPNMHDR)lParam;
switch (pnmhdr->code)
{
case TVN_SELCHANGED:
GetCursorPos(&pt);
ScreenToClient(hTree, &pt);
hitinfo.pt = pt;
hitinfo.flags = TVHT_ONITEM;
hi = TreeView_HitTest(hTree, &hitinfo);
for (int i = 0; i < 7; i++)
if (hi == ti[i])
it = tvs[i].item.pszText;
SetWindowText(GetDlgItem(hDlg, IDC_ITEMTEXT), it);
break;
}
}
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg, TRUE);
break;
}
break;
}
return FALSE;
} |
cs |