본문 바로가기

Programming Tips/MFC

MFC 분할 윈도우(4) - 다중 분할 윈도우 만들기

이번엔 다중 분할 윈도우 예제입니다.
앞서 만들었던 정적 분할 윈도우 예제 소스를 약간 수정만 하면 쉽게 다중 분할 윈도우를 만들 수 있습니다.

◎  CSplitterWnd 클래스의 인스턴스 생성
다중 분할 윈도우는 생성된 분할 윈도우의 위에 또 다른 분할 윈도우를 올려 놓는 것입니다.
그래서 필요한 분할 윈도우의 갯수만큼 인스턴스를 생성해야 합니다.
아래와 같이 두 개의 인스턴스를 만듭니다.

CSplitterWnd m_wndSplitter1;
CSplitterWnd m_wndSplitter2;

만드는 위치는 물론 CMainFrame 클래스입니다.

◎  OnCreateClient의 재정의
다음으로 OnCreateClient함수를 재정의 합니다.

m_wndSplitter1을 이용해서 윈도우를 좌, 우로 나누어줍니다.

if (!m_wndSplitter1.CreateStatic(this, 1, 2))
{
TRACE0("Fail to create splitter.\n");
return FALSE;
}


그리고, m_wndSplitter2를 이용해서 먼저 생성된 m_wndSplitter1로 나누어진 왼쪽 뷰 영역을 다시 상하로 나누어줍니다. CreateStatic함수를 이용하며 첫번째 인자에 m_wndSplitter1의 주소를 넣어주고 다음 인자로 2,1을 넣어서 상,하로 나누어줍니다. 마지막으로 들어가는 인자는 m_wndSplitter1에 의해 나누어진 분할 윈도우의 Row, Col값을 이용하여 m_wndSplitter2로 분할할 뷰의 영역을 지정하게 됩니다. 0,0이 들어가있으니 왼쪽 윈도우를 상,하로 나누는 것이고, 오른쪽 윈도우를 나눌때는 IdFromRowCol(0, 1)이라고 넣어주면 됩니다.

if (!m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1, WS_CHILD | WS_VISIBLE | WS_BORDER, m_wndSplitter1.IdFromRowCol(0, 0)))
{
TRACE0("Fail to create splitter.\n");
return FALSE;
}


m_wndSplitter1과 m_wndSplitter2에 의해 나누어진 각각의 뷰 영역에 CreateView함수로 뷰 클래스를 설정해주고 SetColumnInfo함수를 이용해 왼쪽 뷰 영역의 크기를 다시 한 번 잡아줍니다. 

m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CSplitter_StaticView), CSize(300, 300),pContext);
m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CSplitter_StaticView), CSize(300, 300),pContext);
m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(300, 300), pContext);

m_wndSplitter1.SetColumnInfo(0, 300, 10);

return TRUE;  -> 빼먹지맙시다.

컴파일 후 실행하면 아래와 같은 다중 분할 윈도우가 만들어집니다.


아래는 예제 소스입니다.