최상단 광고

2012년 4월 11일 수요일

CTreeCtrl 에 상태를 나타내는 이미지 표시 하기


요약

MFC의 CTreeCtrl 클래스를 이용하여 체크 박스와 같은 상태를 표시하는 사용자 정의 Tree 컨트롤을 작성할 수 있다.

추가 정보

CTreeCtrl 클래스

MFC의 CTreeCtrl 클래스는 Create를 이용해 생성시 "WC_TREEVIEW" 윈도우 클래스를 이용하여 윈도우를 생성하게 된다. 이 윈도우는 "탐색기"에서 왼편의 디렉토리 구조를 보여줄 때 사용하는 것과 동일한 것이다.

CImageList 클래스

CTreeCtrl에 이미지를 표시하기 위해서는 우선 CImageList 클래스를 이용하여 원하는 이미지를 추가해 주어야 한다. CImageList는 Add 메쏘드를 이용하여 아이콘이나 비트맵 자원을 추가하여 사용할 수 있다.

CTreeCtrl에 상태를 나타내는 이미지 추가

우선 CTreeCtrl의 SetImageList 메쏘드를 이미지 리스트에 대한 참조와 TVSIL_STATE 값을 지정하여 다음과 같이 호출한다.
SetImageList (&m_image, TVSIL_STATE);
이렇게 하여 상태를 표시할 이미지를 가진 이미지 리스트를 트리 컨트롤에 지정하게 된다. 그런 후, 추가하는 트리 아이템에 대하여 다음과 같이 CTreeCtrl의 메쏘드를 호출한다.
hTreeItem1 = InsertItem(&tvstruct1);
// '2'는 현재 아이템에 대해 상태를 나타내는 이미지의 인덱스 값
SetItemState (hTreeItem1, INDEXTOSTATEIMAGEMASK(2), TVIS_STATEIMAGEMASK);
INDEXTOSTATEIMAGEMASK는 다음과 같은 define 문이다.
#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12)
 
실제 Tree 컨트롤의 상태를 표시하는 이미지의 인덱스 값은 12 ~ 9 비트에 저장되어 있으므로 12 비트 만큼 좌측 쉬프트를 시켜 메쏘드를 호출하고 있다. 이와 같이 하면 화면에 지정한 이미지가 트리 아이템의 좌측에 표시되는 것을 볼 수 있다.

상태 변경 시 이미지 변경

사용자가 트리 아이템을 클릭하여 상태가 변경된 경우 이미지를 이에 맞추어 변경해주기 위해서는 OnLButtonDown 이벤트 핸들러를 작성해 주어야 한다.
UINT uFlags=0;
HTREEITEM hItem = HitTest(point,&uFlags);

// State를 나타내는 아이콘 위에 Hit가 있었는지 확인
if( uFlags & TVHT_ONITEMSTATEICON )
{
// State Image는 12bit shift를 해야 정보를 얻을 수 있다.
 int iImage = GetItemState( hItem, TVIS_STATEIMAGEMASK ) >> 12;

 // Item의 State Image를 변경한다. (2면 1로, 1이면 2로)
 SetItemState( hItem, INDEXTOSTATEIMAGEMASK(iImage == 2 ? 1 : 2),
TVIS_STATEIMAGEMASK );
 return;
}

CTreeCtrl::OnLButtonDown(nFlags, point);
 
위와 같은 코드의 경우 트리 아이템에 대해 단 두개의 상태만을 이미지로 보여주는 셈이다. (이미지 인덱스 1과 2) 만일 이 보다 많은 상태를 보여 주려 한다면 SetItemState 부분의 코드를 변경해 주면 될 것이다. 위 코드에서 주의할 점은 GetItemState 한 값을 12 비트만큼 우측 쉬프트해야 현재 상태에 대한 이미지 인덱스 값을 얻어올 수 있다는 것이다. 이는 상태를 설정할 때 죄측 쉬프트를 한 것과 반대의 동작이다.

상태를 확인하는 코드

상태를 변경하는 코드와 더불어 현재 트리 아이템에 대한 상태를 확인하는 간단한 코드를 보자.
// Check 상태인가?
BOOL CMyTreeCtrl::IsItemChecked(HTREEITEM hItem)
{
 return GetItemState( hItem, TVIS_STATEIMAGEMASK) >> 12 == 1;
}
 
역시 GetItemState 한 값을 12 비트 쉬프트 하여 값을 비교해 봄으로 써 원하는 트리 아이템에 대한 상태 값을 확인해 볼 수 있다. 위 코드의 경우는 두 가지 상태를 가진 트리 아이템을 가정하고 있다.

댓글 없음: