|
속성 |
의미 |
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 김용성 저
첨부 파일
|