본문 바로가기
컴퓨터/MFC_API

CTreeCtrl 에 디렉토리 표시하기

by adnoctum 2010. 2. 14.
탐색기의 폴더 목록 트리와 같은 기능을 하는, CTreeCtrl 을 상속받은 클래스를 만들어 보자. 델파이의 것을 사용해도 되긴 하는데, 좀 너무 모양이 옛날 것 같아서... 여하튼, 탐색기와 비교를 해보면 다음과 같다.


CDirTree
왼쪽: CDirTree,     오른쪽: 윈도우즈 탐색기


소스 코드는 다음에 있다.

소스는 Visual C++ 6.0 으로 작성되어 있다. Visual Studio 2008 에서 열어도 별 문제 없이 실행되는 것을 확인하였다. 단, STL을 사용할 시 VC++ 6.0 에서 경고 메세지가 너무 많아 Warning level 을 0 으로 해놓고 컴파일해서 경고는 많을 수 있으므로 이 부분은 이용자가 적당히 처리해 준다.

탐색기에 나오는 '내 네트워크 환경'과 같은 항목은 CDirTree에 없는 것을 알 수 있다. 이러한 몇 개의 특별한 시스템 폴더는 각각에 대하여 각 항목을 트리에 삽입하는 코드를 따로 작성해 주어야 한다. '바탕 화면', '내 컴퓨터'와 같은 시스템 폴더의 실제 경로와 텍스트는 글 [시스템 폴더의 실제 경로, 문자열 얻어 오기]에서 설명한 방법을 이용하여 얻어 간다[각주:1].


폴더를 지정해서 그것을 트리에 삽입하게 되면 원래는 '바탕 화면'도 들어 가지 않게 되므로 이 부분은 따로 처리를 해준다. 트리 컨트롤이 사용할 시스템 이미지 리스트를 얻어서 설정해 준다.


tree control은 다음과 같은 특성을 갖도록 해 놓았는데, 자신이 원하는대로 적당히 바꾸어서 사용하면 될 것이다.

CTreeCtrl의 특성값

CTreeCtrl에 설정해 줄 수 있는 각각의 특성값


각 특성을 설명하면,

TVS_LINESATROOT: root node 옆에 -/+ 버튼을 놓고 버튼과 노드를 잇는 선을 보여 준다.
TVS_HASLINES: node와 node를 연결하는 선을 그린다.
TVS_SHOWSELALWAYS: 선택되어 있는 노드를, 부모 윈도우가 포커스를 잃어도 표시를 해준다.
TVS_HASBUTTONS: -/+ 버튼을 표시한다.
TVS_TRACKSELECT: 마우스 포인터를 움직일 때 포인터 밑에 위치한 항목에 밑줄을 그어 준다.

이와 같은 특성을 갖는 tree control 을 만들기 위해서는, CTreeCtrl 클래스를 상속받은 다음, 다음과 같이 WM_CREATE 메세지 핸들러에서 특성을 설정해 주면 된다.

int CDirTree::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

    if (CTreeCtrl::OnCreate(lpCreateStruct) == -1){

        return -1;

    }   

 

    long style = GetWindowLong(this->GetSafeHwnd(),GWL_STYLE) | TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_LINESATROOT | TVS_TRACKSELECT;

    SetWindowLong(this->GetSafeHwnd(),GWL_STYLE,style);

 

    return 0;

}




이 클래스를 실제 코드에서 사용하기 위해서는 CWnd 를 상속받은 클래스를 만드는 것과 같이 해주면 된다. 예를 들면 다음과 같다.

void CDirTreeTestView::OnInitialUpdate()

{

    CView::OnInitialUpdate();

 

 

    if(!::IsWindow(_tree.GetSafeHwnd())){

        CRect rect;

        GetClientRect(&rect);

        _tree.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(0,0,200,rect.Height()), this, 101020); 

          _tree.SetRootDirectory("");

     }

 }


위의 경우는 Document-View 구조를 갖는, SDI 형태의 프로젝트에서 CView를 상속받은 클래스에서 설정해 주고 있는 모습이다.

CDirTree는 외부 인터페이스(public 함수) 로는 SetRootDirectory 를 가지며, 이것은 파라미터로 넘긴 경로를 root node로 설정해 준다.

코드는 GUI 에 관련된 것임에도 500 줄도 안되는 매우 짧은 것이므로 문서화는 따로 해두지 않는다.



  1. '바탕 화면'이나 '내 문서'와 같은 폴더의 실제 경로는 default 로 C:\Document ~~ \\Desktop, C:\Document ~~My Document 이긴 하지만, 이 설정은 얼마든지 바꿀 수 있다. 따라서 이러한 기본값을 코드에서 그대로 사용하면 안된다 [본문으로]