VS 2010/MFC 프로 그래 밍(상용 컨트롤:트 리 컨트롤 Tree Control 컨트롤 생 성 h 와 인 스 턴 스)

12223 단어 mfc트 리 컨트롤
앞의 절 은 트 리 컨트롤 트 리 컨트롤 의 소개,알림 메시지 와 관련 된 데이터 구 조 를 설명 합 니 다.이 절 은 트 리 컨트롤 의 생 성,CTreeCtrl 류 의 주요 구성원 함수 와 응용 인 스 턴 스 를 포함 합 니 다.
트 리 컨트롤 생 성
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 를 지정 합 니 다.다음은 트 리 컨트롤 의 주요 스타일 과 의 미 를 살 펴 보 자.
  • TVS_DISABLEDRAGDROP:트 리 컨트롤 이 TVN 을 보 내 는 것 을 금지 합 니 다.BEGINDRAG 알림 메시지,즉 드래그 동작 은 지원 되 지 않 습 니 다
  • TVS_EDITLABELS:사용 자 는 노드 의 탭 텍스트 를 편집 할 수 있 습 니 다
  • TVS_HASButtons:"+"또는"-"가 있 는 작은 사각형 을 표시 하여 어떤 항목 이 펼 쳐 졌 거나 펼 쳐 졌 는 지 를 표시 합 니 다
  • TVS_HASLINES:부모 노드 와 하위 노드 간 에 연결 하여 나무의 구 조 를 더욱 뚜렷하게 나타 낸다
  • TVS_LINESATROOT:뿌리 노드 에 연결 합 니 다
  • TVS_SHOWSELLALWAYS:컨트롤 이 입력 초점 을 잃 어도 항목 의 선택 상 태 를 표시 합 니 다
  • 마찬가지 로 트 리 컨트롤 을 동적 으로 만 들 때 위 스타일 의 조합 을 지정 할 수 있 는 것 외 에 WS 를 지정 합 니 다.CHILD 와 WS비 시 블 스타일.
    대화 상자 템 플 릿 에 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.프로그램 실행,결과 팝 업 대화 상자.효 과 는 다음 그림 과 같 습 니 다:

    트 리 컨트롤 에 대한 지식 은 여기까지 입 니 다.이전 컨트롤 에 비해 좀 복잡 할 수 있 습 니 다.그러나 많이 쓰 면 뜻 대로 된다 고 느 낄 것 이다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기