MFC

한 프레임에 뷰 분할 - 스플릿윈도우 클래스 미사용

디버그정 2008. 9. 4. 19:43
이 글에서는 하나의 Frame Window에서 CSplitterWnd 컨트롤을 사용하지 않으면서 여러개의 View를 동시에 분할해서 보여줄 수 있는 방법에 대해 설명한다.

MDI의 경우 CChildFrame 클래스가 View를 포함하는 역할을 수행하는데, 이 클래스에서 자식 View의 크기와 위치를 조정해주는 방식으로 구현이 가능하다.

1. 먼저, CChildFrame 클래스의 OnCreateClient 함수에서 자식 View들을 생성한다.
// 왼쪽(기본) View 생성
if(!CMDIChildWnd::OnCreateClient(lpcs, pContext))
{
  TRACE("Failed to create Left View\n");
  return FALSE;
}

// 중간 View 생성
pContext->m_pNewViewClass = RUNTIME_CLASS(CCenterView);
if(CreateView(pContext, AFX_IDW_PANE_FIRST + 1) == NULL)
{
  TRACE("Failed to create Left View\n");
  return FALSE;  
}

// 오른쪽 View 생성
pContext->m_pNewViewClass = RUNTIME_CLASS(CRightView);
if(CreateView(pContext, AFX_IDW_PANE_FIRST + 2) == NULL)
{
  TRACE("Failed to create Right View\n");
  return FALSE;  
}
CreateView 함수의 두번째 Parameter인 ID #를 AFX_IDW_PANE_FIRST, AFX_IDW_PANE_FIRST + 1 의 순서로 를 차례로 증가시키며 View를 생성한다.

2. CChildFrame 클래스의 OnSize 함수에 다음 내용을 추가한다:
CWnd *pWndL = GetDlgItem(AFX_IDW_PANE_FIRST);
CWnd *pWndC = GetDlgItem(AFX_IDW_PANE_FIRST + 1);
CWnd *pWndR = GetDlgItem(AFX_IDW_PANE_FIRST + 2);

pWndL->MoveWindow(0, 0, cx / 3, cy);
pWndC->MoveWindow(cx / 3, 0, cx / 3, cy);
pWndR->MoveWindow(cx / 3 * 2, 0, cx / 3, cy);
OnCreateClient 함수에서 View 생성시 지정해준 ID #를 이용해 각 View의 포인터를 얻어와 MoveWindow 함수로 레이아웃을 결정해준다.


*Reference: http://www.codeguru.com/forum/showthread.php?t=324687