티스토리 뷰

프로그래밍/API

API Tree

에어버스 2016. 5. 5. 17:20

트리컨트롤

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
공지사항
최근에 올라온 글
최근에 달린 댓글
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