최상단 광고

2012년 4월 11일 수요일

CTreeCtrl


트리컨트롤은 각 항목을 식별하기 위해 HTREEITEM 이라는 핸들을 사용하며, 항목을 추가하기 위해 다음과 같은 구조체를 사용한다.


트리 컨트롤에 데이터 입력하기 위한 TV_INSERTSTRUCT 구조체
typedef struct _TV_INSERTSTRUCT { tvins
    HTREEITEM hParent; //추가될 항목의 상위 항목을 나타내는 핸들
    HTREEITEM hInsertAfter; //추가될 항목의 위치 지정
    TV_ITEM item; //추가될 항목에 대한 정보
} TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;


TV_INSERTSTRUCT 구조체에 내장되어 있는 TV_ITEM
typedef struct _TV_ITEM { tvi
    UINT mask; //TVIF_TEXT, TVIF_IMAGE, TVIF_SELECTEDIMAGE
    HTRRITEM hItem; //항목 핸들
    UINT state; //항목의 상태
    UINT stateMAsk; //항목의 상태 마스크
    LPSTR pszText; //항목이 사용할 텍스트
    int cchTextMax; //pszText이 가리키는 버퍼의 크기
    int iImage; //항목에서 사용할 이미지 인덱스
    int iSelectedImage; //항목이 선택되었을 때 사용할 이미지 인덱스
    int cChildren; //현재 항목이 하위 항목을 갖는지 여부를 나타낸다.
    LPARAM lParam; //현재 항목과 관련된 부가 정보를 나타내는 32비트값
} TV_ITEM, FAR *LPTV_ITEM;

mask는 멤버 함수의 유효성을 판단하는 플러그
TVIF_CHILDREN cChildren 멤버 유효화
TVIF_HANDLE hItem 멤버 유효화
TVIF_IMAGE iImage 멤버 유효화
TVIF_PARAM lParam 멤버 유효화
TVIF_SELECTEDIMAGE iSelectdImage  멤버 유효화
TVIF_STATE state, stateMask 멤버 유효화
TVIF_TEXT pszText, cchTextMax 멤버 유효화


CTreeCtrl 멤버 함수

InsertItem()    새로운 항목을 추가한다.
DeleteItem()    지정한 항목을 삭제한다.
DeleteAllItems()    트리 컨트롤 내의 모든 항목을 삭제한다.
GetCount()    트리 컨트롤 내의 항목의 총 개수를 얻는다.
GetItemText()    지정된 항목의 텍스트를 리턴한다.
HitTest()    지정된 항목의 핸들을 얻는다.
SetImageList()    트리 컨트롤에서 사용할 이미지 리스트를 설정한다.
GetITem()    지정된 항목의 속성을 얻는다.
GetRootItem()    루트 항목의 핸들을 리턴한다.
GetNextSiblingItem()    동일한 레벨의 다음 항목에 대한 핸들을 리턴한다.
Expand()    설정된 항목의 하위 항목을 모두 확장한다.


트리 컨트롤에서 발생하는 여러 이벤트는 TVN_계열로 발생된다.



트리컨트롤(Tree Control)

1. 대화상자에 트리컨트롤을 붙이고 옵션을 다음과 같이 수정하자.

 
   Edit labels: 트리컨트롤에서 에디트 기능을 사용할때.
   Show selection always: 선택된 아이템을 표시할때.
 
2. 맴버 변수를 m_ctrTree라고 만들자(Control형 하나밖에 없다).
 
3. 아이템 추가하기
   TVINSERTSTRUCT  TI;
   TI.hParent  = TVI_ROOT;        // TVI_ROOT, NULL
                         // HTREEITEM값을 사용하면 해당하는 아이템의 자식으로 아이템이 추가된다.
   TI.hInsertAfter = TVI_LAST;    // TVI_FIRST, TVI_LAST, TVI_SORT
   TI.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
   TI.item.iImage = 0;                // Tree가 선택안되었을때 표시될 아이콘
   TI.item.iSelectedImage = 1;   // Tree가 선택되었을때 표시될 아이콘
   TI.item.pszText = "root";
 
   HTREEITEM hTreeItem = m_ctrTree.InsertItem(&TI); // 추가된 아이템의 HTREEITEM이 리턴된다.
 
4. 아이템 확장하기.
   m_ctrTree.Expand(hTreeItem, TVE_EXPAND);
 
5. 아이템 선택시 선택된 아이템 알아보기
   + TVN_SELCHANGED메시지를 사용한다.
   NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
   HTREEITEM hTreeItem = pNMTreeView->itemNew.hItem;   // 이 값이 선택된 아이템의 핸들이다.
 
6. 아이템 문자열 가져오기
   CString str = m_ctrTree.GetItemText(hTreeItem);
 
7. 아이템 개수 알아내기
   int nCount = m_ctrTree.GetCount();
 
8. 아이템 제거하기
   m_ctrTree.DeleteItem(hTreeItem);   // 핸들 아래단의 아이템들도 모두 제거된다.
 
9. 현재 선택된 아이템 알아내기
   HTREEITEM hTreeItem = m_ctrTree.GetSelectedItem();
 
10. 위치로 아이템 찾기
   CPoint  p;
   GetCursorPos(&p);
   ::ScreenToClient(m_ctrTree.m_hWnd, &p);
   HTREEITEM hItem = m_ctrTree.HitTest(p);
 
11. 아이템 확장 축소 감지
   + TVN_ITEMEXPANDED메시지를 사용한다.
   NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
   TVITEM  item;
   item.mask = TVIF_HANDLE;
   item.hItem = pNMTreeView->itemNew.hItem;
   m_ctrTree.GetItem(&item);            // 아이템 정보를 알아낸다.

   if(item.state & TVIS_EXPANDED)
   {
      // 확장
   }
   else
   {
      // 축소
   }
 
12. 아이템 아이콘 설정 변경
   m_ctrTree.SetItemImage(hTreeItem, 0, 1);
 
13. 아이템 에디트 입력중 포커스가 나갈때 입력중인 값 아이템에 적용하기
   + TVN_ENDLABELEDIT메시지를 사용한다.
   TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
 
   CEdit *pEdit = m_ctrTree.GetEditControl();
   if(pEdit)
   {
      CString str;
      pEdit->GetWindowText(str);
      if(str.GetLength() > 0)
      {
         m_ctrTree.SetItemText(pTVDispInfo->item.hItem, str);
      }
   }
 
14. 이미지 리스트 설정
   + CImageList  m_Image;      // 32 x 16 아이콘 BITMAP 16 x 16 2개 짜리
 
   m_Image.m_hImageList = ImageList_LoadImage(
                                          (HINSTANCE) GetWindowLong(m_hWnd, GWL_HINSTANCE),
                                          MAKEINTRESOURCE(IDB_BITMAP_SMALL), 16, 2,
                                          RGB(255,255,255), IMAGE_BITMAP, LR_CREATEDIBSECTION);
   m_ctrTree.SetImageList(&m_Image, TVSIL_NORMAL);

댓글 없음: