2010년 10월 1일 금요일

CSplitterWnd과 CTreeView를 이용하여 윈도우 탐색기처럼 만들기

[그림 1] 비스타에서 윈도우 탐색기 실행 모습(출처: wikipedia.org)

CSplitterWnd과 CTreeView를 이용하여 [그림 1]과 같은 윈도우 탐색기(Windows explorer) 기능을 쉽게 만들려면 (주)EMtool.com에서 제공하는 CSplitterWndAdv와 CSplitTreeView 클래스(class)를 이용하면 된다.


1. MainFrm.h에서 수정

CMainFrm 클래스 정의를 보면 CSplitterWnd 변수가 아래와 같이 보인다.

// 특성입니다.
protected:
CSplitterWnd m_wndSplitter;
public:

이 code를 수정해서 아래로 바꾼다.

// 특성입니다.
protected:
public:
CSplitterWndAdv m_wndSplitter;


2. TreeView를 부모로 하는 클래스의 헤더 파일(header file)

1) 예를 들어 이 클래스를 CTestView라 하면 "TreeView.h" 파일을 보면 아래 정의를 찾을 수 있다.

class CTestView : public CTreeView
{
...
}

부모 클래스가 CSplitTreeView가 되도록 이 정의를 바꾼다.

class CTestView : public CSplitTreeView
{
...
}

2) 클래스 멤버 함수(class member function)를 추가한다.

// 작업입니다.
public:
virtual void ReplaceView(long nID);
CRuntimeClass *GetRightView(long nID) const;

 void SetCurViewID(long nID) { m_nCurViewID = nID; }
 long GetCurViewID(void) const { return m_nCurViewID; }

3) 클래스 멤버 변수(class member variable)를 추가한다.

protected:
long m_nCurViewID;


3. TreeView를 부모로 하는 클래스의 소스 파일(source file)

1) 예를 들어 이 클래스를 CTestView라 하면 "TreeView.cpp" 파일이 소스 파일이 된다. 이 소스 파일에서 바꾸기 기능을 이용해 CTreeView -> CSplitTreeView로 모두 바꾼다.

2) OnInitialUpdate 함수에 트리 항목을 추가한다.

void CTestView::OnInitialUpdate()
{
CTestView::OnInitialUpdate();

InsertTreeItem(NULL, "부모1", 1);
PVOID ptr = InsertTreeItem(NULL, "부모2", 2);
InsertTreeItem(ptr, "자식2-1", 3);
InsertTreeItem(ptr, "자식2-2", 4);
}

InsertTreeItem 함수의 3번째 인수가 우리가 찾아가는 CView의 번호가 된다.
CView의 번호가 0보다 작으면 동작하지 않으므로 반드시 1보다 크게 설정해야 한다.

3) "TreeView.cpp" 파일에 아래 두 함수를 추가한다.

CRuntimeClass *CTestView::GetRightView(long nID) const
{
switch(nID)
{
case 1: return RUNTIME_CLASS(CParent1);
case 2: return RUNTIME_CLASS(CParent2);
case 3: return RUNTIME_CLASS(CChild2_1);
case 4: return RUNTIME_CLASS(CChild2_2);
default: return RUNTIME_CLASS(CError);
}
}

void CTestView::ReplaceView(long nID)
{
CSplitterWndAdv *pWnd;
pWnd = &((CMainFrame *)AfxGetMainWnd())->m_wndSplitter;
pWnd->ReplaceView(0, 1, GetRightView(nID));
m_nCurViewID = nID;

SelectTreeItem(nID);
pWnd->GetPane(0, 1)->UpdateWindow();
}
Enhanced by Zemanta

댓글 없음 :

댓글 쓰기

욕설이나 스팸글은 삭제될 수 있습니다. [전파거북이]는 선플운동의 아름다운 인터넷을 지지합니다.