개요. |
|
VC++ 에서 Tree Control사용법 정리.
기본 활용법.
1. 도구상자에서 Tree Control 을 대화상자에 배치하고 Tree Control 의 속성창에서 ID를 적절한것으로 설정.
2. 클래스 위저드 실행하여 멤버 변수추가. 예: m_TreeNXTask
3. Tree Control 속성의 Has Button과 Has Lines 속성을 모두 True 로 하기.
4. 트리에 아이템 추가하기 위한 트리컨트롤 멤버 함수 InsertItem (, , ,) 호출한다.
|
|
상세. - 기본 활용법. |
|||||
앞의 순서대로 각 단계별 이미지와 함깨 설명한다. 1. 도구상자에서 Tree Control 을 대화상자에 배치하고 Tree Control 의 속성창에서 ID를 적절한것으로 설정.
2. 클래스 위저드 실행하여 상기1의 Tree Control 의 멤버변수 추가. 아래예와 같이 m_TreeNXTask 로 했다. 3. Tree Control 속성의 Has Button과 Has Lines 속성을 모두 True 로 하기. - 이 설정을 해야 아래 트리에서 보이듯이 +,- ,라인이 보이게 된다. 루트 아이템에도 +,-,라인 이 보이게 하려면 Lines At Root 를 true 로 설정한다. 4. 트리에 아이템 추가하기 위한 트리컨트롤 멤버 함수 InsertItem (, , ,) 호출한다. InsertItem() 함수는 인자타입이 다른 4종의 함수들이 제공된다. 더보기
CTreeCtrl::InsertItem
Call this function to insert a new item in a tree view control.
복사 HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );
HTREEITEM InsertItem( UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, HTREEITEM hParent, HTREEITEM hInsertAfter ); HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST ); HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST ); C++
복사 // Insert a root item using the structure. We must // initialize a TVINSERTSTRUCT structure and pass its // address to the call. TVINSERTSTRUCT tvInsert; tvInsert.hParent = NULL; tvInsert.hInsertAfter = NULL; tvInsert.item.mask = TVIF_TEXT; tvInsert.item.pszText = _T("United States"); HTREEITEM hCountry = m_TreeCtrl.InsertItem(&tvInsert); // Insert subitems of that root. Pennsylvania is // a state in the United States, so its item will be a child // of the United States item. We won't set any image or states, // so we supply only the TVIF_TEXT mask flag. This // override provides nearly complete control over the // insertion operation without the tedium of initializing // a structure. If you're going to add lots of items // to a tree, you might prefer the structure override // as it affords you a performance win by allowing you // to initialize some fields of the structure only once, // outside of your insertion loop. HTREEITEM hPA = m_TreeCtrl.InsertItem(TVIF_TEXT, _T("Pennsylvania"), 0, 0, 0, 0, 0, hCountry, NULL); // Insert the "Washington" item and assure that it is // inserted after the "Pennsylvania" item. This override is // more appropriate for conveniently inserting items with // images. HTREEITEM hWA = m_TreeCtrl.InsertItem(_T("Washington"), 0, 0, hCountry, hPA); // We'll add some cities under each of the states. // The override used here is most appropriate // for inserting text-only items. m_TreeCtrl.InsertItem(_T("Pittsburgh"), hPA, TVI_SORT); m_TreeCtrl.InsertItem(_T("Harrisburg"), hPA, TVI_SORT); m_TreeCtrl.InsertItem(_T("Altoona"), hPA, TVI_SORT); m_TreeCtrl.InsertItem(_T("Seattle"), hWA, TVI_SORT); m_TreeCtrl.InsertItem(_T("Kalaloch"), hWA, TVI_SORT); m_TreeCtrl.InsertItem(_T("Yakima"), hWA, TVI_SORT);
아래 함수 원형인 것을 이용하면 아이템에 간단히 문자열 표현하는 경우 간편하다. HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST ); 코드예. 아래 코드처럼 작성하면 오른쪽 그림 처럼 트리컨트롤에 보이게 된다.
|
|||||
상세 - 고급활용법. 트리 아이템에 아이콘 표현하기. |
|||||||||||||
앞의 기본 활용법에서는 Tree Control 에 아이템 추가하는 함수 InsertItem 중에서 가장 간단한 인자 의 것을 사용했다. 이 함수로는 트리 컨트롤에 아이콘 표현이 안된다. 이미지 추가 가능하고, 기타 완전한 제어가 가능한 인자 " LPTVINSERTSTRUCT lpInsertStruct" 인 것을 이용한다. 함수원형 : HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct ); 더보기
TVINSERTSTRUCT structureSyntaxC++
Copy
typedef struct { HTREEITEM hParent; HTREEITEM hInsertAfter;
Members
RemarksThe unions in this structure have been updated to work with compilers that do not support nameless unions. If your compiler does not support nameless unions, define the NONAMELESSUNION token before including the commctrl.h header file.Important Using TVI_LAST to insert an item into a tree-view node that already contains a large number of items can take a long time, causing the application to stop responding until the insert operation completes.
Requirements
트리컨트롤 노드에 이미지 표현위한 설정.
Create 함수 내의 IDB_TREE 는 리소스에 추가된 비트맵 아이디이며, 비트맵으로 CImageList 생성하는 것. 프로젝트 리소스에 비트맵 추가방법 보기 -> http://igotit.tistory.com/751 더보기
CImageList::Create
Initializes an image list and attaches it to a CImageList Class object. 복사
BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow ); BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask ); BOOL Create( LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREF crMask ); BOOL Create( CImageList& imagelist1, int nImage1, CImageList& imagelist2, int nImage2, int dx, int dy ); BOOL Create( CImageList* pImageList );
트리컨트롤에 노드 추가하기 예.
위 코드 실행모습. |
|||||||||||||
트리 아이템 마우스 클릭 처리
트리 컨트롤의 각 아이템을 마우스 클릭(좌, 우, 더블등) 한 경우 해당 아이템 받는 방법.
1. 트리컨트롤의 마우스 이벤트 처리기코드 추가하고,
2. 마우스이베트 처리코드내에서 마우스 좌표를 트리 좌표로 변환하고, 함수 ScreenToClient
3. 트리컨트롤 멤버함수인 HitTest 로 마우스로 선택한 아이템을 받는다.
void CMyDlg::OnNMDblclkTree(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint p;
GetCursorPos(&p);
UINT flag;
m_Tree.ScreenToClient(&p);// 마우스좌표를 트리좌표로 변환하고,
HTREEITEM hItem_dc = m_Tree.HitTest(p,&flag); // HitTest 함수로 트리아이템 받아.
// 시험용 문자 출력.
AfxMessageBox(m_Tree.GetItemText(hItem_dc));
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}
컨텍스트 메뉴.
통상 트리컨트롤에서 우마우스 클리시 컨텍스트 메뉴 보이는 경우 많다.
컨텍스트 메뉴 만드는방법.
드래그 드롭 구현시 텍스트 안보이는 문제 해결.
아이템 정렬 하기.
CTreeCtrl::SortChildren
- 함수 인자로 전달된 아이템 하위의 아이템들을 알파벳 정렬함.
CTreeCtrl::SortChildrenCB
- 별도의 외부 정렬함수 포인터를 인자로 전달하여 아이템 정렬하는것.
트리 순회
// 인자로 전달된 HTREEITEM 이하 모든 아이템 순회.-재귀호출.
int count_item=0;
int TreeSearch_Recursive(HTREEITEM h_item)
{
if (!ItemHasChildren(h_item)) return 0; // 하위 없다. 무처리 리턴.
h_item = GetNextItem(h_item, TVGN_CHILD); //TVGN_CHILD : h_item 의 첫번째 child item
while (h_item) { // 모든 sibling item 마다 반복.
count_item++; // 아이템 수량 카운팅.
TreeSearch_Recursive(h_item); //재귀호출.
h_item = GetNextItem(h_item,TVGN_NEXT);//TVGN_NEXT : sibling item.
}
return count_item;
}
MS 제공 정보.
상위정리
첫 등록 : 2016.01.08
최종 수정 : 2022.04.04
단축 주소 : https://igotit.tistory.com/538
'VisualStudio.C++.C# > 코딩팁,함수활용,단편' 카테고리의 다른 글
MFC . CView . CDC TextOutW 문자열 출력. (3) | 2023.12.03 |
---|---|
CEvent . Lock() . SetEvent() . ResetEvent() (0) | 2022.04.09 |
MFC. menu, context menu (0) | 2022.04.04 |
win api. Cryptography API : Next Generation. 암호화. 복호화. (0) | 2022.04.04 |
VC++ . _CRT_SECURE_NO_WARNINGS . #pragma warning(disable: 4996) (0) | 2022.03.07 |
댓글