728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 트리 컨트롤

 

이번에는 트리 컨트롤에 대해서 소개하고자 합니다.

 

위의 그림에서 빨간색으로 표기된 구조가 Tree Control의 한 예입니다.

이런 구조는 많이 익숙하실거라고 생각됩니다.

 


1. CTreeCtrl 클래스

 

1-a. 멤버 함수

 * InsertItem

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

 

 -> lpszItem : 아이템에 표시할 문자열 주소

 -> hParent : 추가되어 있는 부모 아이템의 헨들 -> TVI_ROOT는 루트 아이템으로 기본 값 지정되어 있음.

 

     (궁금하신 분들은 자료 정의나 구글링 해보세요.)

 -> hInsertAfter : 새로운 아이템이 어떤 아이템의 뒤에 삽입될 것인지를 지정

 *> Return Value : 추가된 아이템의 헨들(HTREEITEM 반환), 실패시 NULL

 

 기존에 리스트 컨트롤 강의에선 InsertItem 이런 거에 담는 개념이었는데,

 이 원형은 HTREEITEM이라는 형태로 반환하여 뿌리 구축 단위로 동작함. (직접 코드 짜보면 이해함)

 

 * DeleteItem 

 BOOL DeleteItem ( HTREEITEM hItem ) ;

 -> hItem : 삭제할 트리 아이템의 헨들

 -> Return Value : 성공시 TRUE, 실패시 FALSE;

 * DeleteAllItems

 BOOL DeleteAllItems( ) ;

 

 -> 트리 컨트롤의 모든 아이템들을 전체 삭제함.

 

 -> Return Value : 성공시 TRUE, 실패시 FALSE

 * GetParentItem

 HTREEITEM GetParentItem( HTREEITEM hItem ) const;

 

 -> hItem : 부모 아이템을 찾고자 하는 트리 아이템의 핸들 (쉽게 말하면 부모 아이템을 가져온다고 이해하는 게 정신적으로 편함)

 -> Return Value : 부모 아이템의 핸들, 실패시 NULL

 

 * GetItemText

 CString GetItemText ( HTREEITEM hItem ) const ;

 

 -> hItem : 텍스트를 획득하고자 하는 트리 아이템의 핸들

 -> Return Value : 트리 아이템의 텍스트

 


1-b. 트리 컨트롤(Tree Control)의 Primative Attribute (주요 속성)

 

 

 

주요 속성이라고 지정하긴 제목을 말하긴 했는데, 트리를 운영하는 데 가장 중요한 요소라서 이렇게 불렀으니깐

쉽게 생각하시기 바랍니다. 잊어버리셔도 됩니다. 동물적으로 찾아서 보실 수 있으면 됩니다.

 

 트리 컨트롤 속성

 설명

 Check Boxes

 아이템에 체크박스를 표시하기 위한 속성

 Has Buttons

 서브 아이템이 있는 경우,

 해당 아이템에 [+], [-] 버튼을 표시하기 위한 속성

 (옵션??이 더 맞는 말인거 같음)

 Has Lines

 아이템 간의 연결 관계를 라인을 사용하여 표현하기 위한 속성

 -> 제 블로그에도 사실 보면 트리 라인있습니다.

     모르시면 메뉴 보셔도 됩니다.

 Lines At Root

 루트 아이템에도 라인을 표시하기 위한 속성.

 Single Expand

 확장되는 아이템을 하나로 지정하기 위한 속성.

 True로 설정하면 하나의 아이템을 확장했을 때 다른 확장 아이템은 축소한다.

 Tract Select

 트래킹 표시를 지정하기 위한 속성

 True로 설정하면 마우스 포인터가 위치된 아이템에 밑줄이 표시된다.

 

 


2. 결과물

 

 

 

 

 

 

 

 

 


3. 실습

 

a. 레이아웃 디자인

 

컨트롤 이름 

 범주(T)

 매개 변수(N)

 비고

 IDC_TREE1

 Control

 m_yourtree

 

 IDC_EDIT1

 해당 없음

 해당 없음

 해당 없음

 

IDC_TREE1의 리소스 속성

Has Buttons, Has Lines, Single Expand, Lines At Root (True)로 해주기

 

 

 

 


4. 코드 구현

 

// CMyTreeDlg 메시지 처리기

BOOL CMyTreeDlg::OnInitDialog()

 

//         (중략~~~~~)

 

         // TODO: 여기에 추가 초기화 작업을 추가합니다.

         HTREEITEM root_branch = m_yourtree.InsertItem(_T("지사"));
         HTREEITEM root_headoffice = m_yourtree.InsertItem(_T("본사"));

         HTREEITEM child_b_china = m_yourtree.InsertItem(_T("중국"), root_branch);
         HTREEITEM child_b_gumi = m_yourtree.InsertItem(_T("한국"), root_branch);

         HTREEITEM child_h_seoul = m_yourtree.InsertItem(_T("서울"), root_headoffice);
         HTREEITEM child_b_c_bejing = m_yourtree.InsertItem(_T("베이징"), child_b_china);

         // this->m_yourtree.InsertItem

 

//         (중략~~~~~)

 

}

 OnInitDialog

 

 

void CMyTreeDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);  // 자동 생성된 부분임.

 

          // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
          HTREEITEM hItemRoot;
          HTREEITEM hItemParent;
          HTREEITEM hItemCur;

 

          CString strRoot;
          CString strParent;
          CString strCur;

          CString strTxt;

 

          hItemCur = pNMTreeView->itemNew.hItem;
          hItemParent = this->m_yourtree.GetParentItem( hItemCur );
          hItemRoot = this->m_yourtree.GetParentItem( hItemParent );

 

          strRoot = m_yourtree.GetItemText(hItemRoot);
          strParent = m_yourtree.GetItemText(hItemParent);
          strCur = m_yourtree.GetItemText(hItemCur);
 
          strTxt.Append(_T("/") + strRoot);
          strTxt.Append(_T("/") + strParent);
          strTxt.Append(_T("/") + strCur);
 
          ::SetDlgItemText( this->m_hWnd, IDC_EDIT1, strTxt );

 

 

           *pResult = 0;      // 자동 생성된 부분임.

 

 OnTvnSelchangedTree1 ( ) -> 마우스로 클릭해서 생성한 함수 원형
 -> (쉽게 말하면, 트리 선택시 동작 구현)

 

 

 

 

 

 

[첨부(Attachment)]

MyTree.zip

 

 

반응형

+ Recent posts