본문으로 바로가기

MDI(Multi Document Interface)로 개발하기 3

category 개발언어/c++ 2016. 7. 19. 14:14

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 부분은 정상적으로 원상복구 시킵니다.

 

이전

다음