본문 바로가기

Programming Tips/MFC

MFC 분할 윈도우(3) - 정적 분할 윈도우 만들기

SDI기반에서 정적 분할 윈도우를 만드는 방법에 대한 간단한 예제입니다.

정적 분할 윈도우를 만드는 방법은 기본적으로 동적 분할 윈도우와 비슷합니다.

◎  새로운 View 생성
정적 분할 윈도우는 하나의 Document에 연결된 서로 다른 뷰를 사용하기 위해 사용하는 것입니다.
다시 말해서 같은 데이터를 다른 방식으로 보여주기 위함이라고 볼 수 있겠지요.
그래서 다른 View를 하나 더 생성해야 합니다. 필요에 따라 CView나 FormView 같은 클래스의 상속을 받
아서 생성하면 되겠죠. 저는 FormView에서 상속을 받아 만들었습니다. FormView의 스타일은 Child이어야 합니다. View를 생성한 후에는 MainFrame 클래스에 Doc의 헤더파일과 생성된 뷰의 헤더파일을 인클루드 합니다. Doc의 헤더파일이 View의 헤더파일보다 위에 있어야 합니다.

#include "Splitter_StaticDoc.h"
#include "Splitter_StaticView.h"
#include "RightView.h"

◎  CSplitterWnd 클래스의 인스턴스 선언
다음은 분할 윈도우가 가지는 여러가지 기능을 담당하는 CSplitterWnd 클래스의 인스턴스를 선언합니다.
동적 분할 윈도우와 똑같은 과정입니다.

CMainFrame의 멤버 변수로 아래와 같이 선언합니다.

CSplitterWnd m_wndSplitter;

◎  OnCreateClient 함수의 재정의
프로그램 상에서 분할 윈도우의 위치는 프레임 윈도우와 뷰 윈도우의 사이가 됩니다. 따라서 프레임 윈도우의 위에 분할 윈도우가 위치해서 영역을 나누고 각각의 영역에 뷰 윈도우를 생성하여 올려지는 형태가 됩니다. OnCreateClient 함수는 클라이언트 영역이 생성될 때 호출되는 함수이며, OnCreateClient 함수를 재정의하여 영역을 분할합니다. 이 부분 역시 동적 분할과 똑같습니다만 동적 분할의 경우에는
CSplitterWnd 클래스의 Create함수를 이용하는 반면에 정적 분할에서는 CreateStatic함수를 이용하여
분할 윈도우를 생성하고 CreateView함수를 이용해서 분할된 각각의 영역에 사용자가 원하는 View를
할당합니다.

아래 그림과 같이 Ctrl + w로 클래스 위저드를 열고 OnCreateClient 함수를 추가합니다.


추가된 OnCreateClient함수에 아래와 같이 소스를 추가하고 return을 TRUE로 바꿔줍니다.

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

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

return TRUE;

컴파일 후 실행하면 아래의 그림과 같이 정적 분할로 생성된 윈도우가 나타납니다.


CreateStatic함수의 원형은 아래와 같습니다.

BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );

pParentWnd와 nRows, nCols만 넘겨주면 됩니다. 

CreateView함수의 원형은 아래와 같으며,

virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );

row와 col의 값에 주의해서 사용하면 됩니다.

아래는 예제 소스입니다.