CAFE

MFC/COM/멀티미디어

[MFC][25기 김현택] Tree Control

작성자25기 김현택|작성시간13.01.07|조회수1,514 목록 댓글 0

Tree Control

 

 

 

 

선문 비트 25

김 현 택

 

 

 

 

      Tree Control이란

 

 

      Tree Control의 주요 속성과 의미

 

 

      Tree Control의 주요 함수

 

 

      예제 프로그램 코드

 

 

      실행 화면

 

 

 

 

n  Tree Control이란

n  각 노드는 자식 노드를 가질 수 있어                                  

계층적인 데이터 표시 할 때 용이합니다

 

 

 

 

 

 

n  Tree Control의 주요 속성과 의미

속성

의미

Has buttons

하위 노드가 있으면 사각형 모양의 버튼을 그려줍니다.

Has Lines

각 노드를 연결하는 라인을 그려줍니다.

Lines at root

루트 노드에도 라인을 그려줍니다.

Edit labels

레이블을 편집할 수 있도록 합니다.

  

  

n  Tree Control의 주요 함수

멤버함수

기능

InsertItem

새로운 항목을 추가합니다.

DeleteItem

지정된 항목을 삭제합니다.

Expand

지정된 항목을 확장하거나 축소시킵니다.

SelectItem

지정된 항목을 선택합니다.

SortChildren

자식 노드를 정렬합니다.

GetCount

총 노드 수를 얻습니다.

SetImageList

GetImageList

각 사용할 이미지 리스트를 설정하고 얻는 기능을 합니다.

SetItemText

GetItemText

각 노드의 텍스트를 설정하고 얻는 기능을 합니다.

 

n   예제 프로그램

추가 버튼 클릭 시

void CTreeViewDlg::OnBnClickedAddButton()

{

             UpdateData();

             HTREEITEM hParent = m_treectrl.GetSelectedItem();

             if(hParent)

             {

                           m_treectrl.InsertItem(this->m_name, 0, 0, hParent);

                           m_treectrl.Expand(hParent, TVE_EXPAND);

                           Invalidate();

             }

}

GetSelectedItem을 사용하여 현재 선택 되어 있는 노드를 얻어오고 추가할 노드의 부모 노드로 InsertItem한다.

추가 후 사용자 편의를 위해 Expand Invalidate를 한다.

 

수정 버튼 클릭 시

void CTreeViewDlg::OnBnClickedModiButton()

{

             HTREEITEM hTree = m_treectrl.GetSelectedItem();

             if(hTree)

             {

                           UpdateData();

                           m_treectrl.SetItemText(hTree, this->m_name);

             }

             else

             {

                           MessageBox(_T("항목을 선택하세요."));

             }

}

GetSelectedItem을 사용하여 현재 선택 되어 있는 노드를 얻어오고 SetItemText을 사용하여

선택된 노드를 입력된 정보로 수정한다.

 

삭제 버튼 클릭 시

void CTreeViewDlg::OnBnClickedDeleteButton()

{

             HTREEITEM htree = m_treectrl.GetSelectedItem();

             int count = m_treectrl.GetCount();

 

             if(htree != m_treectrl.GetRootItem())

             {

                           if(htree)

                           {

                                        m_treectrl.DeleteItem(htree); 

                           }

                           else

                           {

                                        MessageBox(_T("항목을 선택하세요."));

                           }

             }

             else

             {

                           MessageBox(_T("루트를 삭제 할 수 없습니다."));

             }

}

GetSelectedItem을 사용하여 현재 선택 되어 있는 노드를 얻어오고 DeleteItem을 사용하여 해당 노드를 삭제한다.

, 이 시나리오에서는 루트를 삭제 할 수 없게 하였다.

 

Tree 컨트롤에서 노드 클릭 시(TVN_SELCHANGED 이벤트 재정의 부분)

void CTreeViewDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)

{

             LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

             // TODO: 여기에 컨트롤 알림 처리기를 추가합니다.

             HTREEITEM hTree = m_treectrl.GetSelectedItem();

             if(hTree)

             {

                           if(hTree == m_treectrl.GetRootItem())

                           {

                                        CString selectedname = m_treectrl.GetItemText(hTree);

                                        m_name = selectedname;

                                        m_parent = TEXT("ROOT");

                           }

                           else

                           {

                                        CString selectedname = m_treectrl.GetItemText(hTree);

                                        m_name = selectedname;

                                        HTREEITEM hParent = m_treectrl.GetParentItem(hTree);

                                        CString selectedparent = m_treectrl.GetItemText(hParent);

                                        m_parent = selectedparent;

                           }

                           UpdateData(false);

             }

             else

             {

                           MessageBox(_T("항목을 선택하세요."));

             }

             *pResult = 0;

}

Tree 컨트롤에서 다른 항목으로 선택이 변경 되었음을 알리는 TVN_SELCHANGED이벤트를 재정의 하여 현재 선택되어 있는 노드의 정보를 Edit 컨트롤에 보여준다.

GetParentItem을 사용하여 노드의 부모 노드를 얻어 올 수 있다.

 

검색 버튼 클릭 시

void CTreeViewDlg::OnBnClickedSearchButton()

{

             UpdateData();

             HTREEITEM hRoot = m_treectrl.GetRootItem();

 

             if(hRoot)

             {

                           HTREEITEM hFind = FindNode(this->m_search, hRoot);

                           if(hFind)

                           {

                                        m_treectrl.SelectItem(hFind);

                           }

                           else

                           {

                                        MessageBox(_T("검색된 항목이 없습니다."));

                           }

             }

}

입력된 노드명과 기준 노드를 정하여 FindNode로 해당 하는 노드를 검색한다.

 

FindNode(LPCTSTR nodeName, HTREEITEM hRoot)

HTREEITEM CTreeViewDlg::FindNode(LPCTSTR nodeName, HTREEITEM hRoot)

{

             HTREEITEM hNode = hRoot;

             while(hNode)

             {

                           HTREEITEM hChild = 0;

                           if(nodeName == m_treectrl.GetItemText(hNode)) · · · · · · · · · · · · · · · · · · ①

                         {

                                        return hNode;

                           }

                          

                          hChild = m_treectrl.GetNextItem(hNode, TVGN_CHILD); · · · · · · · · · · · · · ②

                           if(hChild)

                           {

                                        HTREEITEM hFind = 0;

                                        hFind = FindNode(nodeName, hChild);

                                        if(hFind)

                                        {

                                                     return hFind;

                                        }

                           }

                           hNode = m_treectrl.GetNextItem(hNode, TVGN_NEXT); · · · · · · · · · · · · · ③

             }

             return 0;

}

① - 전달 받은 노드와 현재 노드의 이름이 같으면 전달 받은 노드를 반환 한다.

② - ①이 참이 아닐 시, 선택한 노드를 기준으로 다음 노드를 얻어 오는 GetNextItem을 사용하여 전달 받은 노드의 자식을 얻어온다. 자식 노드가 있으면 다시 한번 자식 노드를 기준으로 FindNode을 사용한다.

③ - ②가 참이 아닐 시, 같은 레벨에 있는 형제 노드를 얻어오는 GetNextItem을 사용한다.

while문을 사용하여 전달 받은 노드를 기준으로 같은 레벨과 하위 레벨 노드들에 대해 검색한다.

 


 

n  실행화면

Main

추가 후

검색 후

삭제 후

 

참고문헌 : Visual C++ 6 김용성 저

 

첨부 파일

첨부파일 TreeControl 기술문서.doc

 

첨부파일 TreeView.exe

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼