트리 컨트롤의 기본 사용법, 예제 코드.
 
CBitmap Bmp; 
 Bmp.LoadBitmap(IDB_TreeImageList); //트리항목앞의 이미지를 위해 만듬

 static CImageList ImgList;
 ImgList.Create(16,16, ILC_COLOR24, 6, 0); // 16*16, 24비트,6개이미지
 ImgList.Add(&Bmp, RGB(255,0,0)); //이미지 리스트에 이미지설정
 m_Tree.SetImageList(&ImgList, TVSIL_NORMAL); //트리컨트롤에 이미지 리스트를 설정


 HTREEITEM hItem = NULL; //트리 항목의 핸들
 hItem = m_Tree.InsertItem(_T("바탕화면"), 0,5,TVI_ROOT); //이 항목을 루트로 설정함
 hItem = m_Tree.InsertItem(_T("내 문서"), 1,5, hItem); 
 hItem = m_Tree.InsertItem(_T("내 그림"), 2,5, hItem);
 
//자식 항목을 등록하지 않아도 되면 저장할 필요가 없다.
 m_Tree.InsertItem(_T("내꼬"), 3,5, hItem); 
 m_Tree.InsertItem(_T("내꼬2"), 4,5, hItem);

// 추가한 항목이 너무 많을 경우 화면에 보여주지 못하는 경우에는 자동으로 스크롤된다.
 m_Tree.EnsureVisible(hItem); //hItem 설정한 곳까지는 다 보이게 한다. 여기서는 '내 그림'까지는 펼쳐서 보인다.

 m_Tree.Expand(hItem,     TVE_EXPAND); //특정 항목의 자식 항목이 펼쳐보이게 한다. 그 이하는 불가능
//여기서 다 보이게 된다.

주요 통지 메시지 처리
TVN_SELCHANGED 통지 메시지는 트리 컨트롤에서 선택 항목이 변경되었을 때 발생하는데, 윈도우 탐색기의 폴더 보기에서 특정 폴더를 선택하면 오른쪽 파일 목록 보기의 내용이 해당 폴더의 내용으로 변경되는 상황같은 것을 구현하고자 할때 주로 사용한다. 다음은 이를 이용한 예제 소스다. 먼저 TVN_SELCHANGED 통지 메시지를 등록한다.

void CTreeCtrlDemoDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
 
 CString strItem = m_Tree.GetItemText(pNMTreeView->itemNew.hItem);
 GetDlgItem(IDC_Static_Selected)->SetWindowText(strItem);

 

 *pResult = 0;
}




자식 항목의 처리
리스트 컨트롤에서는 인덱스로 항목을 식별하나, 트리 컨트롤에서는 항목간에 부모 자식 관계가 성립하므로 인덱스가 아닌 소속과 관계가 의미를 갖는다. 그러므로 전체 항목에 접근할 때는 재귀 호출을 가져야 한다. 또한 트리 컨트롤에 Check Boxes 속성을 적용하면 각 트리 항목 앞에 확인란이 생기며 자주 사용한다.

void CTreeCtrlDemoDlg::OnBnClickedButtonCheckupchild()
{
 HTREEITEM hItem = m_Tree.GetRootItem();
 if(m_Tree.GetCheck(hItem))
  AfxMessageBox(m_Tree.GetItemText(hItem));

 CheckUpChild(m_Tree.GetRootItem());
}

void CTreeCtrlDemoDlg::CheckUpChild(HTREEITEM hItem)
{
//인자로 전달받은 트리 항목 핸들의 첫 번째 자식 항목의 핸들을 반환한다.
 HTREEITEM hChildItem = m_Tree.GetChildItem(hItem);

 while(hChildItem != NULL) 
 {
  if(m_Tree.GetCheck(hChildItem)) //자식 항목이 체크되었으면
   AfxMessageBox(m_Tree.GetItemText(hChildItem)); 자식 항목의 문자열을 출력

  if(m_Tree.ItemHasChildren(hChildItem)) //자식 항목에게 또 자식이 있으면
   CheckUpChild(hChildItem); //재귀호출해라

  hChildItem = m_Tree.GetNextItem(hChildItem, TVGN_NEXT); //자식이 없으면 다음 아이템으로 넘어가자
 }

}



// Visual Studio 2008 Feature Pack 에 CMFCShellTreeCtrl 클래스에 윈도우 탐색기가 들어있으므로 분석해볼 것!

'Windows > MFC' 카테고리의 다른 글

탭 컨트롤  (0) 2011.11.18
드래그 앤 드롭 ( Drag-And-Drop)  (0) 2011.11.18
이미지 프로세싱  (0) 2011.11.15
RGB 와 CMYK, HSV, HLS  (0) 2011.11.15
ATL, STL, COM 은 무엇인가?  (0) 2011.11.15

+ Recent posts