MDI를 온전히 구성하기 위해서 CChildFrame을 추가 합니다.
CMDIChildWnd를 상속 받았다는 것에 주목하시고
이렇게 하면 ChildFrame 이 생성되게 됩니다.
"AppFrame.h"에 추가된 "ChildFrame.h"를 추가 합니다.
#include "resource.h" // main symbols
#include <afxtempl.h> // for CTypedPtrArray CMap 등 Collection
#include "ChildFrame.h"
/////////////////////////////////////////////////////////////////////////////
// CAppFrameApp:
// See AppFrame.cpp for the implementation of this class
//
그 다음은 BOOL CAppFrameApp::InitInstance()에서 아래와 같이 변경하여 CChildFrame 을
부착한 CMultiDocTemplate를 만듧니다.
CAppFrameApp::InitInstance()
{
………………………………………….
//// MDI 1
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CAppFrameDoc),
RUNTIME_CLASS(ChildFrame), // custom MDI child frame
RUNTIME_CLASS(CAppFrameView));
AddDocTemplate(pDocTemplate);
…………………..
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
::PostMessage(m_pMainWnd->m_hWnd,WM_COMMAND,ID_WINDOW_TILE_VERT,NULL);
}
여기까지 수정한 결과를 실행 시켜 보면 바로 아래의 그림과 같은 모양의 화면을 볼 수 있을 것입니다.ChildFrame이 MainFrame의 자식 윈도우가 되어 TILE(ID_WINDOW_TILE_VERT )로 정렬된 모습 입니다.
앞의 MDI(Multi Document Interface)로 개발하기2 글에서 설명에서 보았을 때 보였던 화면과 비교를 해보면 차이가 보입니다. MDI(Multi Document Interface)로 개발하기2는 결과 적으로 ChildFrame이
없이 MainFrame만 여러개 생성 시킨 것입니다.
여기서 CMultiDocTemplate는 CFrameWnd가 아닌 CMDIChildWnd와 같이 구성된다는 것을 확인 할 수 있습니다.
이는 MDI로 여러 개의 다른 종류의 파일을 열 때 그 파일에 성격에 맞는 메뉴 및 화면을 별도로
구성할 수 있도록 고안된 조치 입니다.
CMDIFrameWnd 로 공통적인 메인 프레임을 구성하고, 그 하위에 CMDIChildWnd로 각각의 상황에 맞는 자식 프레임을 만들고 CMDIChildWnd의 하위에 파일의 내용을 적절하게 표현하는 CView를 배치 한다는 의미 입니다. 이렇게 기본 형태를 만들어 놓고,
그 구조 아래서 각각은 상속받아서 적절한 코드를 구성하는 것입니다.
좀더 엄밀히 따지면 현재 까지 의 상태는 CreateView();가
CMDIChildWnd를 여러개 만든 것입니다.
CAppFrameApp::InitInstance()에서 맨 아래 부분에 있는 내용을 빨간색과 같이 바꾸어 보면.
//::PostMessage(m_pMainWnd->m_hWnd,WM_COMMAND,ID_WINDOW_TILE_VERT,NULL);
(baseFRAME*)m_pMainWnd)->MDIMaximize(pMainFrame->GetActiveFrame());
//MDI에서 CildFrame 최대화 시키기, 자식윈도우 최대화
그리고 CChildFrame에 MainFrame과 똑 같이 툴바를 추가 해 봅니다
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
그런 다음 윈도우 최대사이즈 일 때와 보통 사이즈 일 때를 비교 해 보면 상태가 어떻게 변했는지 알 수 있습니다.
다음은 CChildFrame을 약간 수정해서 CChildFrame의 System Menu와 SizeBox를 제거 해봅니다.
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style ^=(WS_MINIMIZEBOX|WS_SYSMENU);
return CMDIChildWnd::PreCreateWindow(cs);
}
화면이 SDI 형태로 바뀌었습니다.
화면구성에 있어서 SDI와 MDI의 차이점이 무엇인지 이해가 되실 것입니다.
화면형태를 확인 했으니
//::PostMessage(m_pMainWnd->m_hWnd,WM_COMMAND,ID_WINDOW_TILE_VERT,NULL);
(baseFRAME*)m_pMainWnd)->MDIMaximize(pMainFrame->GetActiveFrame());
CChildFrame::PreCreateWindow 부분은 정상적으로 원상복구 시킵니다.
'개발언어 > c++' 카테고리의 다른 글
MDI(Multi Document Interface)로 개발하기5 (0) | 2016.07.25 |
---|---|
MDI(Multi Document Interface)로 개발하기4 (0) | 2016.07.25 |
MDI(Multi Document Interface)로 개발하기2 (0) | 2016.07.19 |
MDI(Multi Document Interface)로 개발하기1 (0) | 2016.07.18 |
LNK2005 _DllGetClassObjec,already defined in AtlTest.obj (0) | 2016.07.18 |