요약
MFC의 CTreeCtrl 클래스를 이용하여 체크 박스와 같은 상태를 표시하는 사용자 정의 Tree 컨트롤을 작성할 수 있다.
추가 정보
CTreeCtrl 클래스
MFC의 CTreeCtrl 클래스는 Create를 이용해 생성시 "WC_TREEVIEW" 윈도우 클래스를 이용하여 윈도우를 생성하게 된다. 이 윈도우는 "탐색기"에서 왼편의 디렉토리 구조를 보여줄 때 사용하는 것과 동일한 것이다.CImageList 클래스
CTreeCtrl에 이미지를 표시하기 위해서는 우선 CImageList 클래스를 이용하여 원하는 이미지를 추가해 주어야 한다. CImageList는 Add 메쏘드를 이용하여 아이콘이나 비트맵 자원을 추가하여 사용할 수 있다.CTreeCtrl에 상태를 나타내는 이미지 추가
우선 CTreeCtrl의 SetImageList 메쏘드를 이미지 리스트에 대한 참조와 TVSIL_STATE 값을 지정하여 다음과 같이 호출한다.SetImageList (&m_image, TVSIL_STATE);
hTreeItem1 = InsertItem(&tvstruct1);
// '2'는 현재 아이템에 대해 상태를 나타내는 이미지의 인덱스 값
SetItemState (hTreeItem1, INDEXTOSTATEIMAGEMASK(2), TVIS_STATEIMAGEMASK);
#define INDEXTOSTATEIMAGEMASK(i) ((i) << 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);
상태를 확인하는 코드
상태를 변경하는 코드와 더불어 현재 트리 아이템에 대한 상태를 확인하는 간단한 코드를 보자.// Check 상태인가?
BOOL CMyTreeCtrl::IsItemChecked(HTREEITEM hItem)
{
return GetItemState( hItem, TVIS_STATEIMAGEMASK) >> 12 == 1;
}
댓글 없음:
댓글 쓰기