티스토리 뷰
트리 뷰라고도 불리며, 이미지와 텍스트를 이용하여 게층적인 형태로 정보를 표시하는 역활을 한다.
이미지를 사용할 경우 이미지 리스트 컨트롤을 이용해야 한다.
- 부모(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(10, 10, 150, 150), this, 101);
CImageList il; // 이미지 리스트 초기화
il.Create(IDB_BITMAP1, 16, 1, RGB(255, 255, 255));
CTreeCtrl& tree = GetTreeCtrl();
tree.SetImageList(&il, TVSIL_NORMAL); // 이미지 리스트 설정
il.Detach();
// 1레벨 초기화
HTREEITEM hSun = tree.InsertItem(L"태양", 0, 0, 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], 1, 1, hSun, TVI_LAST);
// 3레벨 초기화
tree.InsertItem(L"달", 2, 2, hPlanet[2], TVI_LAST);
tree.InsertItem(L"포보스", 2, 2, hPlanet[3], TVI_LAST);
tree.InsertItem(L"데이모스", 2, 2, hPlanet[3], TVI_LAST);
tree.InsertItem(L"이오", 2, 2, hPlanet[4], TVI_LAST);
tree.InsertItem(L"에우로파", 2, 2, hPlanet[4], TVI_LAST);
tree.InsertItem(L"가니메데", 2, 2, 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 |