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

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

이전

다음

“MDI(Multi Document Interface)로 개발하기 3”의 8개의 댓글

  1. First of all I would like to say great blog! I had a quick question that I’d like
    to ask if you do not mind. I was interested to know how you center yourself and clear
    your mind prior to writing. I’ve had a hard time clearing my mind in getting my thoughts out there.
    I truly do enjoy writing however it just seems like the first 10 to 15
    minutes tend to be wasted just trying to figure out how to begin. Any
    suggestions or hints? Kudos!

  2. Cbd oil that works 2020
    Hi fantastic blog! Does running a blog such as
    this take a great deal of work? I have absolutely no expertise
    in programming but I was hoping to start my own blog in the near future.
    Anyway, should you have any ideas or tips for new blog owners please share.

    I understand this is off topic but I simply wanted to ask.
    Thank you! best rated cbd oil http://j.mp/3drY6lE cbd oil that works 2020 http://j.mp/3drY6lE

  3. Hey! I know this is kinda off topic however , I’d figured
    I’d ask. Would you be interested in trading links or maybe guest authoring a blog article or
    vice-versa? My site discusses a lot of the same subjects as yours and I believe we could greatly benefit
    from each other. If you’re interested feel free to send me an email.

    I look forward to hearing from you! Great blog by the way!

  4. Greetings from Colorado! I’m bored to tears at work so
    I decided to browse your blog on my iphone during lunch break.
    I really like the knowledge you provide here and can’t
    wait to take a look when I get home. I’m surprised at how fast your blog loaded on my cell
    phone .. I’m not even using WIFI, just 3G .. Anyways, wonderful
    site!

  5. Having read this I thought it was rather informative.
    I appreciate you taking the time and effort to put this short article
    together. I once again find myself personally spending way too much time both reading and leaving comments.
    But so what, it was still worth it!

  6. Thanks for your marvelous posting! I genuinely
    enjoyed reading it, you happen to be a great author.I will be sure to
    bookmark your blog and definitely will come back later in life.
    I want to encourage continue your great work, have a
    nice evening!

댓글 남기기