VS 2010/MFC 프로 그래 밍(상용 컨트롤:트 리 컨트롤 Tree Control 컨트롤 생 성 h 와 인 스 턴 스)
트 리 컨트롤 생 성
MFC 는 트 리 컨트롤 에 CTreeCtrl 클래스 를 제공 합 니 다.트 리 컨트롤 의 모든 동작 을 패키지 합 니 다.
트 리 컨트롤 을 만 드 는 것 도 두 가지 방법 이 있 습 니 다.하 나 는 대화 상자 템 플 릿 에 Tree Control 컨트롤 을 직접 끌 어 들 여 만 드 는 것 이 고,다른 하 나 는 CTreeCtrl 류 의 Create 멤버 함 수 를 통 해 만 드 는 것 입 니 다.다음은 후자 다.
CTreeCtrl 클래스 의 Create 구성원 함수 의 원형 은 다음 과 같 습 니 다.
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
이 함수 의 원형 은 앞에서 말 한 모든 컨트롤 류 의 Create 함수 와 유사 합 니 다.dwStyle 은 트 리 컨트롤 스타일 의 조합 을 지정 합 니 다.rect 는 트 리 컨트롤 창의 위치 와 크기 를 지정 합 니 다.pParentWnd 는 트 리 컨트롤 부모 창 을 가리 키 는 지침 이 고 nID 는 트 리 컨트롤 의 ID 를 지정 합 니 다.다음은 트 리 컨트롤 의 주요 스타일 과 의 미 를 살 펴 보 자.대화 상자 템 플 릿 에 Tree Control 을 직접 끌 어 와 트 리 컨트롤 을 만 들 때 트 리 컨트롤 의 속성 페이지 에 스타일 을 설정 할 수 있 습 니 다.위의 스타일 과 대응 합 니 다.예 를 들 어 속성 Has Lines 에 대응 하 는 것 은 TVS 입 니 다.HASLINES 스타일.
CTreeCtrl 클래스 의 주요 구성원 함수
CImageList* SetImageList(CImageList * pImageList,int nImageListType);
트 리 노드 가 아이콘 을 표시 하려 면 먼저 CImageList 류 의 대상 을 만 들 고 여러 개의 그림 을 추가 하여 이미지 시퀀스 를 구성 한 다음 SetImageList 함 수 를 트 리 컨트롤 로 이미지 시퀀스 를 설정 해 야 합 니 다.InsertItem 으로 노드 를 삽입 할 때 필요 한 그림 이 이미지 시퀀스 에 있 는 색인 을 입력 하면 됩 니 다.뒤의 예 에서 시연 할 것 이다.파라미터 pImageList 는 이미지 시퀀스 클래스 CImageList 의 대상 을 가리 키 는 지침 이 며,NULL 이면 트 리 컨트롤 의 모든 그림 을 삭제 합 니 다.파라미터 nImageListType 이 지정 한 이미지 시퀀스 의 종 류 는 TVISIL 일 수 있 습 니 다.NORMAL(일반 이미지 시퀀스)또는 TVISILSTATE(상태 이미지 시퀀스,이미지 로 노드 의 상 태 를 표시 함).
UINT GetCount( ) const;
트 리 컨트롤 의 노드 수 를 가 져 옵 니 다.
DWORD_PTR GetItemData(HTREEITEM hItem) const;
트 리 컨트롤 에서 지정 한 노드 의 추가 32 비트 데 이 터 를 가 져 옵 니 다.매개 변수 hItem 은 지정 한 트 리 노드 의 핸들 입 니 다.
BOOL SetItemData(HTREEITEM hItem,DWORD_PTR dwData);
트 리 컨트롤 의 지정 한 노드 에 추 가 된 32 비트 데 이 터 를 설정 합 니 다.인자 hItem 과 같이 dwData 는 설정 할 32 비트 데이터 입 니 다.
CString GetItemText(HTREEITEM hItem) const;
트 리 컨트롤 에서 지정 한 노드 의 탭 텍스트 를 가 져 옵 니 다.인자 hItem 동상.반환 값 은 탭 텍스트 를 포함 하 는 문자열 입 니 다.
BOOL SetItemText(HTREEITEM hItem,LPCTSTR lpszItem);
트 리 컨트롤 의 지정 한 노드 에 탭 텍스트 를 설정 합 니 다.인자 hItem 과 같이 lpszItem 은 탭 텍스트 를 포함 하 는 문자열 의 지침 입 니 다.
HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const;
트 리 컨트롤 에서 지정 한 노드 의 다음 형제 노드 를 가 져 옵 니 다.인자 hItem 동상.반환 값 은 다음 형제 노드 의 핸들 입 니 다.
HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const;
트 리 컨트롤 에서 지정 한 노드 의 이전 형제 노드 를 가 져 옵 니 다.인자 hItem 동상.반환 값 은 이전 형제 노드 의 핸들 입 니 다.
HTREEITEM GetParentItem(HTREEITEM hItem) const;
트 리 컨트롤 에서 지정 한 노드 의 부모 노드 를 가 져 옵 니 다.인자 hItem 동상.반환 값 은 부모 노드 의 핸들 입 니 다.
HTREEITEM GetRootItem( ) const;
트 리 컨트롤 루트 노드 의 핸들 을 가 져 옵 니 다.
HTREEITEM GetSelectedItem( ) const;
트 리 컨트롤 이 현재 선택 한 노드 의 핸들 을 가 져 옵 니 다.
BOOL DeleteAllItems( );
트 리 컨트롤 의 모든 노드 를 삭제 합 니 다.삭제 에 성공 하면 TRUE 로 돌아 갑 니 다.그렇지 않 으 면 FALSE 로 돌아 갑 니 다.
BOOL DeleteItem(HTREEITEM hItem);
트 리 컨트롤 의 한 노드 를 삭제 합 니 다.인자 hItem 은 삭제 할 노드 의 핸들 입 니 다.삭제 에 성공 하면 TRUE 로 돌아 갑 니 다.그렇지 않 으 면 FALSE 로 돌아 갑 니 다.
HTREEITEM InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent = TVI_ROOT,HTREEITEM hInsertAfter = TVI_LAST);
트 리 컨트롤 에 새 노드 를 삽입 합 니 다.매개 변수 lpszItem 은 새 노드 의 탭 텍스트 문자열 의 지침 입 니 다.매개 변수 nImage 는 새 노드 의 아이콘 이 트 리 컨트롤 이미지 시퀀스 에 있 는 색인 입 니 다.매개 변수 nSelected Image 는 새 노드 가 선 택 될 때의 아이콘 이 이미지 시퀀스 에 있 는 색인 입 니 다.매개 변수 hParent 는 노드 를 삽입 하 는 부모 노드 의 핸들 입 니 다.매개 변수 hInsertAfter 는 새 노드 의 이전 노드 의 핸들 입 니 다.즉,새 노드 는 hInsert After 노드 에 삽 입 될 것 입 니 다.
BOOL SelectItem(HTREEITEM hItem);
지정 한 트 리 노드 를 선택 하 십시오.인자 hItem 은 선택 할 노드 의 핸들 입 니 다.성공 하면 TRUE 로 돌아 갑 니 다.그렇지 않 으 면 FALSE 로 돌아 갑 니 다.트 리 컨트롤 의 인 스 턴 스
마지막 으로 CListCtrl 류 의 구성원 함수 와 트 리 컨트롤 알림 메시지 등 사용 방법 을 설명 하 는 간단 한 인 스 턴 스 를 써 드 리 겠 습 니 다.
이 인 스 턴 스 가 실현 하 는 기능:하나의 트 리 컨트롤 에 사이트 의 간단 한 구 조 를 나타 내 고 모두 3 층 으로 나 뉘 는데 각각 사이트,각 분류 와 글 이다.선택 한 노드 를 왼쪽 단 추 를 누 르 면 선택 한 노드 의 텍스트 를 편집 상자 에 표시 합 니 다.또한 루트 노드 를 제외 한 트 리 노드 를 마우스 로 그 을 때 해당 하 는 Tip 알림 정 보 를 표시 하 는 흔 한 효 과 를 실현 해 야 한다.다음은 구체 적 인 실현 절차 이다.
1.대화 상 자 를 기반 으로 하 는 MFC 프로젝트 를 만 들 고 이름 은'Example 31'로 설정 합 니 다.
2.자동 으로 생 성 되 는 대화 상자 템 플 릿 IDEXAMPLE31_DIALOG 에 서 는'TODO:Place dialog controls here.'정적 텍스트 상자,'OK'단추 와'Cancel'단 추 를 삭제 합 니 다.Tree Control 컨트롤 을 추가 합 니 다.ID 는 IDC 로 설정 합 니 다.WEB_TREE,속성 Has Buttons,Has Lines,Lines At Root 는 모두 True 로 설정 되 어 있 으 며,마우스 로 특정한 노드 를 지 날 때 알림 정 보 를 표시 하기 위해 서 는 Info Tip 속성 을 True 로 설정 해 야 합 니 다.정적 텍스트 상자 와 편집 상 자 를 추가 합 니 다.정적 텍스트 상자 의 Caption 속성 은"선택 한 노드:"로 설정 하고 편집 상자 의 ID 는 IDC 로 설정 합 니 다.ITEM_SEL_EDIT,Read Only 속성 은 True 로 설정 합 니 다.다음 그림 과 같은 대화 상자 템 플 릿:
3.트 리 컨트롤 의 노드 에 추가 할 아이콘 을 가 져 옵 니 다.32x 32 아이콘 아이콘 세 개 를 찾 아 프로젝트 의 res 디 렉 터 리 에 저장 합 니 다.그리고 리 소스 뷰 자원 보기에 서 아이콘 노드 를 오른쪽 클릭 하고 오른쪽 메뉴 에서'리 소스 추가...'를 선택 하고'리 소스 추가'대화 상 자 를 팝 업 한 다음 왼쪽'리 소스 type'목록 에서'아이콘'을 선택 하고 오른쪽'Import...'단 추 를 누 르 면 세 개의 아이콘 파일 을 선택 하여 가 져 올 수 있 습 니 다.가 져 오기 에 성공 하면 각각 ID 를 IDI 로 변경 합 니 다.WEB_ICON、IDI_CATALOG_ICON 과 IDIARTICLE_ICON。
4.트 리 컨트롤 IDCWEB_TREE CTreeCtrl 형식의 컨트롤 변수 m 추가webTree。그리고 Example31Dlg.h 파일 에 CExample31Dlg 클래스 에 구성원 대상 추가:CImageList mimageList;。
5.대화 상자 가 초기 화 될 때 트 리 컨트롤 에 사이트 의 트 리 구 조 를 추가 합 니 다.CExample31Dlg:OnInitDialog()함 수 는 다음 과 같 습 니 다.
BOOL CExample31Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
......
// TODO: Add extra initialization here
HICON hIcon[3]; //
HTREEITEM hRoot; //
HTREEITEM hCataItem; //
HTREEITEM hArtItem; //
// ,
hIcon[0] = theApp.LoadIcon(IDI_WEB_ICON);
hIcon[1] = theApp.LoadIcon(IDI_CATALOG_ICON);
hIcon[2] = theApp.LoadIcon(IDI_ARTICLE_ICON);
// CImageList
m_imageList.Create(32, 32, ILC_COLOR32, 3, 3);
//
for (int i=0; i<3; i++)
{
m_imageList.Add(hIcon[i]);
}
//
m_webTree.SetImageList(&m_imageList, TVSIL_NORMAL);
//
hRoot = m_webTree.InsertItem(_T(" "), 0, 0);
//
hCataItem = m_webTree.InsertItem(_T("IT "), 1, 1, hRoot, TVI_LAST);
// “IT ” ,
m_webTree.SetItemData(hCataItem, 1);
// “IT ”
hArtItem = m_webTree.InsertItem(_T(" 1"), 2, 2, hCataItem, TVI_LAST);
// “ 1” ,
m_webTree.SetItemData(hArtItem, 2);
// “IT ”
hArtItem = m_webTree.InsertItem(_T(" 2"), 2, 2, hCataItem, TVI_LAST);
// “ 2” ,
m_webTree.SetItemData(hArtItem, 3);
//
hCataItem = m_webTree.InsertItem(_T(" "), 1, 1, hRoot, TVI_LAST);
// “ ” ,
m_webTree.SetItemData(hCataItem, 4);
// “ ”
hArtItem = m_webTree.InsertItem(_T(" 1"), 2, 2, hCataItem, TVI_LAST);
// “ 1” ,
m_webTree.SetItemData(hArtItem, 5);
// “ ”
hArtItem = m_webTree.InsertItem(_T(" 2"), 2, 2, hCataItem, TVI_LAST);
// “ 2” ,
m_webTree.SetItemData(hArtItem, 6);
//
hCataItem = m_webTree.InsertItem(_T(" "), 1, 1, hRoot, TVI_LAST);
// “ ” ,
m_webTree.SetItemData(hCataItem, 7);
// “ ”
hArtItem = m_webTree.InsertItem(_T("C++ 1"), 2, 2, hCataItem, TVI_LAST);
// “C++ 1” ,
m_webTree.SetItemData(hArtItem, 8);
// “ ”
hArtItem = m_webTree.InsertItem(_T("VS2010/MFC 2"), 2, 2, hCataItem, TVI_LAST);
// “VS2010/MFC 2” ,
m_webTree.SetItemData(hArtItem, 9);
//
hCataItem = m_webTree.InsertItem(_T(" "), 1, 1, hRoot, TVI_LAST);
// “ ” ,
m_webTree.SetItemData(hCataItem, 10);
// “ ”
hArtItem = m_webTree.InsertItem(_T(" 1"), 2, 2, hCataItem, TVI_LAST);
// “ 1” ,
m_webTree.SetItemData(hArtItem, 11);
// “ ”
hArtItem = m_webTree.InsertItem(_T("IT 2"), 2, 2, hCataItem, TVI_LAST);
// “IT 2” ,
m_webTree.SetItemData(hArtItem, 12);
return TRUE; // return TRUE unless you set the focus to a control
}
6.선택 한 노드 가 바 뀌 었 을 때 최신 선택 항목 을 편집 상자 에 실시 간 으로 표시 하고 싶 습 니 다.그러면 TVN 에 응답 할 수 있 습 니 다.SELCHANGED 알림 메시지.트 리 컨트롤 IDCWEB_트 리 의 알림 메시지 TVNSELCHANGED 메시지 처리 함수 CExample31Dlg:OnTvnSelchanged WebTree 를 추가 하고 함수 체 를 다음 과 같이 수정 합 니 다.
void CExample31Dlg::OnTvnSelchangedWebTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
CString strText; //
//
HTREEITEM hItem = m_webTree.GetSelectedItem();
//
strText = m_webTree.GetItemText(hItem);
//
SetDlgItemText(IDC_ITEM_SEL_EDIT, strText);
}
7.또 하나의 기능 을 실현 해 야 한다.그것 은 바로 마우스 가 뿌리 노드 를 제외 한 특정한 트 리 노드 를 지나 갈 때 해당 하 는 Tip 알림 정 보 를 표시 하 는 것 이다.이 인 스 턴 스 에서 정 보 를 노드 의 번호 로 제시 하 는 것 이다.이것 은 TVN 에 응답 해 야 합 니 다.GETINFOTIP 알림 메시지.트 리 컨트롤 IDCWEB_트 리 의 알림 메시지 TVNGETINFOTIP 메시지 처리 함수 CExample31Dlg:OnTvnGetInfoTipWebTree 를 추가 하고 함수 체 를 다음 과 같이 수정 합 니 다.
void CExample31Dlg::OnTvnGetInfoTipWebTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR; // pNMHDR NMTVGETINFOTIP
HTREEITEM hRoot = m_webTree.GetRootItem(); //
CString strText; //
if (pTVTipInfo->hItem == hRoot)
{
// ,
strText = _T("");
}
else
{
// , 32
strText.Format(_T("%d"), pTVTipInfo->lParam);
}
// strText pTVTipInfo pszText , strText
wcscpy(pTVTipInfo->pszText, strText);
}
8.프로그램 실행,결과 팝 업 대화 상자.효 과 는 다음 그림 과 같 습 니 다:트 리 컨트롤 에 대한 지식 은 여기까지 입 니 다.이전 컨트롤 에 비해 좀 복잡 할 수 있 습 니 다.그러나 많이 쓰 면 뜻 대로 된다 고 느 낄 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[프로세스 간 통신] 오일 탱크를 이용하여 프로세스 간의 통신을 실현하다2: 연결이 없는 신뢰할 수 없는 데이터 전송 4: 오일 탱크의 서버 프로세스 읽기, 클라이언트 프로세스 쓰기 "데이터 수신", IDM_MAILSLOT_RECE,view에서 메뉴에 명령 응답 추가 2: 응답 함수에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.