개요.

 
VC++ 에서 Tree Control사용법 정리.

기본 활용법.
1. 도구상자에서 Tree Control 을  대화상자에 배치하고 Tree Control 의 속성창에서 ID를 적절한것으로 설정.
2. 클래스 위저드 실행하여 멤버 변수추가. 예: m_TreeNXTask
3. Tree Control 속성의 Has Button과 Has Lines 속성을 모두 True 로 하기.
4. 트리에 아이템 추가하기 위한 트리컨트롤 멤버 함수 InsertItem (, , ,) 호출한다.

 


 

 

상세. - 기본 활용법.

 

앞의 순서대로 각 단계별 이미지와 함깨 설명한다.


1. 도구상자에서 Tree Control 을  대화상자에 배치하고 Tree Control 의 속성창에서 ID를 적절한것으로 설정.


2. 클래스 위저드 실행하여 상기1의 Tree Control 의 멤버변수 추가.  아래예와 같이 m_TreeNXTask 로 했다.



3. Tree Control 속성의 Has Button과 Has Lines 속성을 모두 True 로 하기.

- 이 설정을 해야 아래 트리에서 보이듯이 +,- ,라인이 보이게 된다. 루트 아이템에도 +,-,라인 이 보이게 하려면 Lines At Root 를 true 로 설정한다.


4.  트리에 아이템 추가하기 위한 트리컨트롤 멤버 함수 InsertItem (, , ,) 호출한다.

InsertItem() 함수는 인자타입이 다른 4종의 함수들이 제공된다.  



아래 함수 원형인 것을 이용하면 아이템에 간단히 문자열 표현하는 경우 간편하다.


HTREEITEM InsertItem(
   LPCTSTR lpszItem,
   HTREEITEM hParent = TVI_ROOT,
   HTREEITEM hInsertAfter = TVI_LAST
);


코드예.

아래 코드처럼 작성하면 오른쪽 그림 처럼 트리컨트롤에 보이게 된다.



 


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
void CCyNXTask1_UITDlg::OnBnClickedViewtreeNxtask()
{
    CString cst_level0;
    CString cst_entryord, cst_exitorder;
 
    HTREEITEM h_root;
    HTREEITEM h_entry, h_exit;
    for (int i = 0; i < 5; i++)
    {
        cst_level0.Format(_T("NXtask=%d"), i);
        h_root = m_TreeNXTask.InsertItem(cst_level0, NULL, NULL);
 
        h_entry = m_TreeNXTask.InsertItem(_T("Entry"), h_root, NULL);
        for (int j = 0; j < 2; j++)
        {
            cst_entryord.Format(_T("Order%d"),j);
            m_TreeNXTask.InsertItem(cst_entryord, h_entry, NULL);
        }
 
        h_exit = m_TreeNXTask.InsertItem(_T("Exit"), h_root, NULL);
        for (int j = 0; j < 4; j++)
        {
            cst_entryord.Format(_T("Order%d"), j);
            m_TreeNXTask.InsertItem(cst_entryord, h_exit, NULL);
        }
    }
}
 



 



 


 

 

 

 

상세 - 고급활용법. 트리 아이템에 아이콘 표현하기. 

 

 앞의 기본 활용법에서는 Tree Control 에 아이템 추가하는 함수 InsertItem 중에서 가장 간단한 인자 의 것을 사용했다.

이 함수로는 트리 컨트롤에 아이콘 표현이 안된다. 

 

이미지 추가 가능하고, 기타 완전한 제어가 가능한 인자 " LPTVINSERTSTRUCT lpInsertStruct" 인 것을 이용한다.

 

함수원형 : HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );

 


 

트리컨트롤 노드에 이미지 표현위한 설정.

 

 

1
2
3
4
5
6
7
 
  // CImageList m_ImageListTree ; 헤더에 정의.
    m_ImageListTree.Create(IDB_TREE,16,1,ILD_NORMAL);
 
  // 트리컨트롤에 이미지 리스트 추가. 
    m_Tree.SetImageList(&m_ImageListTree, TVSIL_NORMAL);
 

상기 설정은 1회만 설정되면 되고, 대화상자인 경우 OnInitDialog 에서 실행되면 된다.

Create 함수 내의 IDB_TREE 는 리소스에 추가된 비트맵 아이디이며, 비트맵으로 CImageList 생성하는 것.

프로젝트 리소스에 비트맵 추가방법 보기 -> http://igotit.tistory.com/751

 

 

트리컨트롤에 노드 추가하기 예.

 

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
 
    TVINSERTSTRUCT tvInsert; 
 
    //TVINSERTSTRUCT 설정들 먼저 하고, 
    tvInsert.hParent = NULL; 
    tvInsert.hInsertAfter = TVI_LAST;
    tvInsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; 
    tvInsert.item.state = 0;
    tvInsert.item.stateMask = 0;
    tvInsert.item.cchTextMax = 60; 
 
    tvInsert.item.cChildren = 0; 
 
    /// 루트에 추가할 노드 특성 설정. 
    tvInsert.item.pszText = _T("Computer");        // 노드 텍스트.
    tvInsert.item.iImage = 0;                    // 노드 기본 이미지 지정. 
    tvInsert.item.iSelectedImage = 1;         // 노드 선택시 이미지 지정.
 
    HTREEITEM hRoot = m_Tree.InsertItem(&tvInsert); //레벨1 루트에 추가. 
 
    /// 루트 밑에 노드 추가.
    tvInsert.hParent = hRoot; 
    tvInsert.item.pszText = _T("노드텍스트1");
    tvInsert.item.iImage = 1;                    // 노드 접힘시 이미지 지정.
    tvInsert.item.iSelectedImage = 1;                  // 노드 펼침시 이미지 지정.
 
    m_Tree.InsertItem(&tvInsert); //루트 하위에 추가. 
 
    tvInsert.item.pszText = _T("노드텍스트2");
    m_Tree.InsertItem(&tvInsert); //루트 하위에 추가. 
 
    m_Tree.Expand(hRoot, TVE_EXPAND);// 루트 펼친상태로 
 
 

 

위 코드 실행모습.

 

 

 

 


 

트리 아이템 마우스 클릭 처리

 

트리 컨트롤의 각 아이템을 마우스 클릭(좌, 우, 더블등) 한 경우 해당 아이템 받는 방법.


1. 트리컨트롤의 마우스 이벤트 처리기코드 추가하고, 

2. 마우스이베트 처리코드내에서 마우스 좌표를 트리 좌표로 변환하고, 함수 ScreenToClient

3. 트리컨트롤 멤버함수인 HitTest 로 마우스로 선택한 아이템을 받는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CMyDlg::OnNMDblclkTree(NMHDR *pNMHDR, LRESULT *pResult)
{
    CPoint p; 
    GetCursorPos(&p); 
    UINT flag; 
    m_Tree.ScreenToClient(&p);// 마우스좌표를 트리좌표로 변환하고, 
    HTREEITEM hItem_dc = m_Tree.HitTest(p,&flag); // HitTest 함수로 트리아이템 받아. 
 
    // 시험용 문자 출력.
    AfxMessageBox(m_Tree.GetItemText(hItem_dc));
 
 
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    *pResult = 0;
}
 




 

.

 




드래그 드롭 구현시 텍스트 안보이는 문제 해결. 






아이템 정렬 하기. 

CTreeCtrl::SortChildren

- 함수 인자로 전달된 아이템 하위의 아이템들을 알파벳 정렬함. 


CTreeCtrl::SortChildrenCB

- 별도의 외부 정렬함수 포인터를 인자로 전달하여 아이템 정렬하는것. 





MS 제공 정보.




 

 본 글 포함 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 



 


첫 등록 : 2016.01.08

최종 수정 : 2020.10.14

단축 주소 : https://igotit.tistory.com/538

 


 



Posted by 리치굿맨

댓글을 달아 주세요