티스토리 뷰

프로그래밍/MFC

MFC 트리 컨트롤 (CTreeCtrl)

에어버스 2016. 7. 10. 12:43
MFC 트리 컨트롤 (CTreeCtrl)

트리 뷰라고도 불리며, 이미지와 텍스트를 이용하여 게층적인 형태로 정보를 표시하는 역활을 한다.
이미지를 사용할 경우 이미지 리스트 컨트롤을 이용해야 한다.

- 부모(Parent) 항목
어떤 항목이 하나 이상의 하나의 하위 항목을 가진 경우 이를 부모 항목이라 한다.

- 자식(Child) 항목
부모 항목에 딸린 하위 항목을 자식 항목이라 부른다.

- 계층(Root) 항목
계층 구조에서 최상위 항목을 루트 항목이라 부르며, 루트 항목은 부모 항목을 가지지 않는다.

<스타일>

- Has buttons
부모 항목 앞에 + 또는 - 버튼을 표시한다.

- Has lines
항목을 선으로 연결하여 표시한다.

- Lines at root
루트 항목을 선으로 연결하여 표시한다.

- Edit labels
텍스트를 곧바로 수정할 수 있도록 한다.

- Disable drag drop
항목을 마우스로 끌어서 이동하는 것을 금지한다.

- Show selection always
트리 컨트롤이 키보드 포커스를 잃더라도 선택된 항목이 계속 반전된 상태로 남아 있도록 한다.

- Check boxes
COMCTRL32.DLL 버전 5.80 이상에서는 항목 앞에 자동으로 체크 박스가 표시되며, 하위 버전의 경우에는 사용자가 정의한 상태 이미지(Checked, Unchecked)를 제공해줘야 한다.

- Full row select
Has lines 스타일과 같이 사용할 수 없으며 항목을 선택하면 항목이 포함된 줄 전체가 반전 표시된다.

- Info tip
툴팁에 표시할 정보를 요청하는 메시지를 부모 윈도우에게 보내며, 부모 윈도우는 TVN_GETINFOTIP 통지 코드를 처리해야 한다.

- Scroll
가로, 세로 스크롤 바를 자동으로 표시한다.

- Tool tips
컨트롤 폭이 좁아서 항목 텍스트 일부가 가려질 경우 툴팁으로 표시한다.

- Non even height
부모 윈도우에서 TVM_SETITEMHEIGHT 통지 코드를 처리하면 각 항목의 높이응 서로 다르게 할 수 있다.

- Single expand
하나의 트리 항목이 펼쳐지면 이미 펼쳐져 있던 다른 트리 항목이 자동으로 축소된다.

<트리 컨트롤 초기화>

1. CTreeCtrl 객체를 선언한 후 CTreeCtrl::Create() 로 트리 컨트롤을 생성한다.
2. CImageList 객체를 선언한 후 CImageList::Create(), CLimageList::Add() 등을 이용하여 이미지 리스트를 초기화 한다.
3. CTreeCtrl::SetImageList() 로 트리 컨트롤에서 사용할 이미지 리스트를 설정한다.
4. CTreeCtrl::InsertItem() 으로 항목을 추가한다.

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
CTreeCtrl tree; // 트리 컨트롤 객체 선언과 생성
tree.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASBUTTONS | TVS_HASLINES |
    TVS_LINESATROOT, CRect(1010150150), this101);
 
CImageList il; // 이미지 리스트 초기화
il.Create(IDB_BITMAP1, 161, RGB(255255255));
CTreeCtrl& tree = GetTreeCtrl();
tree.SetImageList(&il, TVSIL_NORMAL); // 이미지 리스트 설정
il.Detach();
 
// 1레벨 초기화
HTREEITEM hSun = tree.InsertItem(L"태양"00, TVI_ROOT, TVI_LAST);
 
// 2레벨 초기화
HTREEITEM hPlanet[9];
CString planet[] = { L"수성", L"금성", L"지구", L"화성", L"목성", L"토성", L"천황성", L"해왕성", L"명왕성" };
for (int i = 0; i < 9; i++)
    hPlanet[i] = tree.InsertItem(planet[i], 11, hSun, TVI_LAST);
 
// 3레벨 초기화
tree.InsertItem(L"달"22, hPlanet[2], TVI_LAST);
tree.InsertItem(L"포보스"22, hPlanet[3], TVI_LAST);
tree.InsertItem(L"데이모스"22, hPlanet[3], TVI_LAST);
tree.InsertItem(L"이오"22, hPlanet[4], TVI_LAST);
tree.InsertItem(L"에우로파"22, hPlanet[4], TVI_LAST);
tree.InsertItem(L"가니메데"22, hPlanet[4], TVI_LAST);
cs

1-1 CTreeCtrl 객체 선언과 트리 컨트롤 생성 (1 ~ 3행)

BOOL CTreeCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParaentWnd, UINT nID);

SwStyle : 컨트롤 스타일을 지정하며 일반 윈도우 스티알(WS_*)과 트리 컨트롤 스타일(TVS_*)의 조합으로 사용한다.
rect : 컨트롤 크기와 위치를 지정하며 RECT 또는 CRect 객체를 사용한다.
pParentWnd : 부모 윈도우를 나타낸다.
nID : 컨트롤 ID

2-1. CImageList 객체 선언과 이미지 리스트 초기화

16*16 크기의 비트맵 3개를 연결 시켰다. (6행)

3-1. 이미지 리스트 설정 (8행)

CImageList* CListCtrl::SetImageList(CImageList* pImageList, int nImageListType);

pImageList : 트리 컨트롤에서 사용할 이미지 리스트를 나타낸다.
nImageListType : 이미지 리스트에 포함된 이미지의 용도를 나타낸다. 항목을 나타내는 일반 이미지일 경우에는 TVSIL_NORMAL, 사용자 정의 상태 이미지일 경우에는 TVSIL_STATE 를 사용한다.

4-1 항목 추가 (12 ~ 26행)

HTREEITEM CTreeCtrl::InsertItem(LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParaent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);

lpszItem : 항목에 표시할 텍스트
nImage : 항목에 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용한다.
nSelectedImage : 항목이 선택되면 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용한다.
hParent : 부모 항목을 나타내는 HTREEITEM 값이다. 루트 항목을 추가할 경우에는 부모 항목이 없으므로 TVI_ROOT 를 대신 사용한다.
hInsertAfter : 항목을 추가할 위치를 나타내며 보통 아래 값 중 하나를 사용한다. 특정 항목 다음에 추가하고 싶은 경우 그항목을 나타내는 HTREEITEM 값을 사용하면 된다.

<hInsertAfter>

 값

의미 

 TVI_FIRST 

 제일 앞쪽에 추가한다. 

 TVI_LAST 

 제일 뒤쪽에 추가한다. 

 TVI_ROOT 

 루트 항목으로 추가한다. 

 TVI_SORT 

 철자순으로 정렬이 되도록 추가한다. 

이 함수의 리턴값은 HTREEITEM 타입이며, 이를 저장해 두었다가 자식 항목을 추가할때 다시 사용한다.

- 스타일 변경하기

이미 생성한 트리 컨트롤 스타일을 프로그램 실행 중 변경 가능하다.

BOOL CWnd::ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0);

dwRemove :  제거할 스타일
dwAdd : 추가할 스타일
nFlags : 스타일 변경한 후 이 값에 따라 컨트롤의 위치나 크기를 바꿀 수 있는데 특별한 경우가 아니면 기본값을 사용하면 된다.

- 선택 항목 알아내기

CTreeCtrl::GetSelectedItem()은 현재 선택한 항목을 나타내는 HTREEITEM 값을 리턴한다.
항목에 대한 구체적인 정보가 필요하면 CTreeCtrl::GetItem* 형태의 함수를 호출히면 된다.

- 항목 추가와 삭제

항목을 추가하려면 부모 항목의 HTREEITEM 값을 저장해 두었다가 필요할 때마다 CTreeCtrl::InsertItem()을 호출하면 된다.
항목을 삭제하려면 CTreeCtrl::DeleteItem()을 호출한다.

1
2
3
HTREEITEM hItem = tree.GetSelectedItem();
if (hItem != NULL)
    tree.DeleteItem(hItem);
cs
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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