2010년 9월 26일 일요일

분할창(splitter window)

아래에 VS2008을 이용하여 분할창을 생성하는 방법을 소개한다.

1. 새 프로젝트 창 -> Visual C++ -> MFC - MFC 응용 프로그램 선택

2. MFC 응용 프로그램 마법사
   - 사용자 인터페이스 기능 -> 주프레임 스타일: 분할창 선택
   - 생성된 클래스 -> 기본 클래스: CTreeView(필요에 따라 다른 클래스 선택 가능)로 선택

프로젝트 생성시에 이렇게 선택하지 못했다면 "MainFrm.h"에 들어가 CMainFrame 클래스에 아래 변수를 삽입하면 된다.
class CMainFrame : public CFrameWnd
{
...
// 특성입니다.
public:
 CSplitterWnd m_wndSplitter;
...
}; 
분할창이 생성되면 "MainFrm.cpp"에 들어가서 아래의 인수를 조정해서 분할창 갯수와 최소창 크기를 조정할 수 있다.

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
return m_wndSplitter.Create(this,
1, 2,               // TODO: 행 및 열의 갯수를 조정합니다.
CSize(10, 10),      // TODO: 최소 창 크기를 조정합니다.
pContext);
}

그런데, 이렇게 분할창을 생성하면 실행시 처음에는 분할창이 보이지 않는다.
사용자가 끝부분(분할상자(splitter box)라 부르는 부분)을 잡아끌어야 분할창들이 보이게 된다.
처음부터 분할창들이 특정비율대로 보이게 하려면 분할창 생성을 아래와 같이 바꾸어야 한다.

#define LEFTVIEW_SIZE (0.2) // 20%로 설정

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)

{
// 클라이언트(client) 크기 얻기
CRect rect;
GetClientRect(&rect);

// 분할창 생성
if (!m_wndSplitter.CreateStatic(this, 1, 2 )) return FALSE;

if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTestView1),
CSize((int)(LEFTVIEW_SIZE*rect.Width()), rect.Height()), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}

if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CTestView2),
CSize((int)((1 - LEFTVIEW_SIZE)*rect.Width()), rect.Height()), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}

return TRUE;
}

위의 code가 정상적으로 돌아가려면 CTestView1과 CTestView2라는 클래스가 이미 존재해야 한다.
새로운 클래스(class)는 "클래스 뷰"로 들어가서(왼쪽편 아래를 보면 "클래스 뷰"라는 탭(tab)이 보인다) 마우스의 오른쪽을 클릭해서 "추가 -> 클래스" 순으로 누르면 된다.
그러면 "클래스 추가 창"이 뜬다.
이중에서 "범주: Visual C++ -> MFC", "템플릿: MFC 클래스"로 선택하고 "추가" 단추를 누른다.
그 다음에는 "MFC 클래스 마법사 창"이 뜬다.
이중에서 "기본 클래스"만 잘 선택하면 된다. 보통은 CFormView로 선택하면 무난하다.

분할창의 크기를 저장하고 불러오려면 (주)EMtool.com에서 제공하는 아래 코드를 삽입하면 된다.
void CMainFrame::OnClose()
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

 // 분할창 현재 크기 저장
 SaveWinPos(this, _T("SplitWnd"));
...
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
...
 // 분할창 이전 크기 불러오기
 RestoreWinPos(cs, _T("SplitWnd"));
...
}

댓글 없음 :

댓글 쓰기

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