본문 바로가기

Programming Tips/MFC

MFC 분할 윈도우(2) - 동적 분할 윈도우 만들기

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

동적 분할 윈도우를 만드는 과정은 아주 간단합니다.

MFC 프로그램에서 윈도우의 형태와 메뉴바 등과 관련된 부분을 담당하는 부분은 CMainFrame입니다.
분할 윈도우도 CMainFrame에서 만들어줍니다. 아래와 같이 두 과정을 거치면 쉽게 만들 수 있습니다.

◎  CSplitterWnd 클래스의 인스턴스 선언
처음해야 될 일은 분할 윈도우가 가지는 여러가지 기능을 담당하는 CSplitterWnd 클래스의 인스턴스를 선언합니다.

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

CSplitterWnd m_wndSplitter;

◎  OnCreateClient 함수의 재정의
프로그램 상에서 분할 윈도우의 위치는 프레임 윈도우와 뷰 윈도우의 사이가 됩니다. 따라서 프레임 윈도우의 위에 분할 윈도우가 위치해서 영역을 나누고 각각의 영역에 뷰 윈도우를 생성하여 올려지는 형태가 됩니다. OnCreateClient 함수는 클라이언트 영역이 생성될 때 호출되는 함수이며, OnCreateClient 함수를 재정의하여 영역을 분할합니다.

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


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

if (!m_wndSplitter.Create(this, 2, 2, CSize(100, 100), pContext))
 {
  TRACE0("Fail to create splitter.\n");
  return FALSE;
 }

 return TRUE;

컴파일 후 실행을 시키면 오른쪽과 아래쪽의 스크롤바 끝 부분에 SplitterBar가 생성된 것을 볼 수 있습니다.
Create 함수의 원형은 아래와 같습니다.

BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE |WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_PANE_FIRST );


nMaxRows와 nMaxCols에는 1과 2의 값만 사용 할 수 있으며,
nMaxRows에 1을 넣으면 세로로는 분할되지 않고, nMaxCols에 1을 넣으면 가로로 분할되지 않습니다.

아래는 예제 소스입니다.