탐색기의 폴더 목록 트리와 같은 기능을 하는, CTreeCtrl 을 상속받은 클래스를 만들어 보자. 델파이의 것을 사용해도 되긴 하는데, 좀 너무 모양이 옛날 것 같아서... 여하튼, 탐색기와 비교를 해보면 다음과 같다.
왼쪽: CDirTree, 오른쪽: 윈도우즈 탐색기
소스 코드는 다음에 있다.
소스는 Visual C++ 6.0 으로 작성되어 있다. Visual Studio 2008 에서 열어도 별 문제 없이 실행되는 것을 확인하였다. 단, STL을 사용할 시 VC++ 6.0 에서 경고 메세지가 너무 많아 Warning level 을 0 으로 해놓고 컴파일해서 경고는 많을 수 있으므로 이 부분은 이용자가 적당히 처리해 준다.
탐색기에 나오는 '내 네트워크 환경'과 같은 항목은 CDirTree에 없는 것을 알 수 있다. 이러한 몇 개의 특별한 시스템 폴더는 각각에 대하여 각 항목을 트리에 삽입하는 코드를 따로 작성해 주어야 한다. '바탕 화면', '내 컴퓨터'와 같은 시스템 폴더의 실제 경로와 텍스트는 글 [시스템 폴더의 실제 경로, 문자열 얻어 오기]에서 설명한 방법을 이용하여 얻어 간다. 1
폴더를 지정해서 그것을 트리에 삽입하게 되면 원래는 '바탕 화면'도 들어 가지 않게 되므로 이 부분은 따로 처리를 해준다. 트리 컨트롤이 사용할 시스템 이미지 리스트를 얻어서 설정해 준다.
tree control은 다음과 같은 특성을 갖도록 해 놓았는데, 자신이 원하는대로 적당히 바꾸어서 사용하면 될 것이다.
각 특성을 설명하면,
TVS_LINESATROOT: root node 옆에 -/+ 버튼을 놓고 버튼과 노드를 잇는 선을 보여 준다.
TVS_HASLINES: node와 node를 연결하는 선을 그린다.
TVS_SHOWSELALWAYS: 선택되어 있는 노드를, 부모 윈도우가 포커스를 잃어도 표시를 해준다.
TVS_HASBUTTONS: -/+ 버튼을 표시한다.
TVS_TRACKSELECT: 마우스 포인터를 움직일 때 포인터 밑에 위치한 항목에 밑줄을 그어 준다.
이와 같은 특성을 갖는 tree control 을 만들기 위해서는, CTreeCtrl 클래스를 상속받은 다음, 다음과 같이 WM_CREATE 메세지 핸들러에서 특성을 설정해 주면 된다.
이 클래스를 실제 코드에서 사용하기 위해서는 CWnd 를 상속받은 클래스를 만드는 것과 같이 해주면 된다. 예를 들면 다음과 같다.
위의 경우는 Document-View 구조를 갖는, SDI 형태의 프로젝트에서 CView를 상속받은 클래스에서 설정해 주고 있는 모습이다.
CDirTree는 외부 인터페이스(public 함수) 로는 SetRootDirectory 를 가지며, 이것은 파라미터로 넘긴 경로를 root node로 설정해 준다.
코드는 GUI 에 관련된 것임에도 500 줄도 안되는 매우 짧은 것이므로 문서화는 따로 해두지 않는다.
소스 코드는 다음에 있다.
소스는 Visual C++ 6.0 으로 작성되어 있다. Visual Studio 2008 에서 열어도 별 문제 없이 실행되는 것을 확인하였다. 단, STL을 사용할 시 VC++ 6.0 에서 경고 메세지가 너무 많아 Warning level 을 0 으로 해놓고 컴파일해서 경고는 많을 수 있으므로 이 부분은 이용자가 적당히 처리해 준다.
탐색기에 나오는 '내 네트워크 환경'과 같은 항목은 CDirTree에 없는 것을 알 수 있다. 이러한 몇 개의 특별한 시스템 폴더는 각각에 대하여 각 항목을 트리에 삽입하는 코드를 따로 작성해 주어야 한다. '바탕 화면', '내 컴퓨터'와 같은 시스템 폴더의 실제 경로와 텍스트는 글 [시스템 폴더의 실제 경로, 문자열 얻어 오기]에서 설명한 방법을 이용하여 얻어 간다. 1
폴더를 지정해서 그것을 트리에 삽입하게 되면 원래는 '바탕 화면'도 들어 가지 않게 되므로 이 부분은 따로 처리를 해준다. 트리 컨트롤이 사용할 시스템 이미지 리스트를 얻어서 설정해 준다.
tree control은 다음과 같은 특성을 갖도록 해 놓았는데, 자신이 원하는대로 적당히 바꾸어서 사용하면 될 것이다.
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 줄도 안되는 매우 짧은 것이므로 문서화는 따로 해두지 않는다.
- '바탕 화면'이나 '내 문서'와 같은 폴더의 실제 경로는 default 로 C:\Document ~~ \\Desktop, C:\Document ~~My Document 이긴 하지만, 이 설정은 얼마든지 바꿀 수 있다. 따라서 이러한 기본값을 코드에서 그대로 사용하면 안된다 [본문으로]
'컴퓨터 > MFC_API' 카테고리의 다른 글
CScrollView의 OnDraw의 좌표 (0) | 2011.07.30 |
---|---|
Report형식의 CListCtrl에서 특정 항목 선택하기 (0) | 2010.03.30 |
시스템 폴더의 실제 경로, 문자열 얻어 오기 (0) | 2010.02.14 |
CWnd에 대하여 (0) | 2010.01.15 |
전체 화면으로 만들기 (0) | 2009.12.27 |