컴퓨터 공부/MFC 프로그래밍

[5월 25일 2교시] MDI

려리군 2009. 5. 25. 11:06

SDI to MDI

1. CChildWnd를 CMDIChildWnd를 Base Class로 하여 새로운 MFC클래스를 생성한다.

2. MainFrm.cpp, MainFrm.h 에서 CFrameWnd를 CMDIFrameWnd로 바꾼다.

3. InitInstance()에서 CSingleDocTemplate를 CMultiDocTemplate로 바꾼다.

그리고 전달인자 중 CMainFrame을 CChildFrame으로 바꾼다.

4. InitInstance()에서 적절한 위치에 다음 부분을 추가한다.

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))

return FALSE;

m_pMainWnd = pMainFrame;


5. CMainFrm의 생성자를 protected에서 public으로 바꾼다.


SDI : 동시에 하나의 Document만 편집할 수 있는 응용프로그램

MDI : 동시에 여러 개의 Document를 편집. 새로운 문서가 열릴 때마다 Document객체 생성. 

CMainFrame : 객체 수는 오직 1개. Menu와 컨트롤 바 포함. CApp::InitInstance함수에서 생성.

CChildFrame : child window가 만들어 질 때마다 framework에 의해 생성.  View를 포함한다.


Document Template

CMultiDocTemplate::CMultiDocTemplate(리소스아이디, Document, ChildFrame, View);

CWinApp::AddDocTemplate

리소스 ID : 하나의상의 Document가 열려 있을 경우의 resource(IDR_????TYPE)

각 타이틀바, 메뉴, 아이콘 등이 Document Template에 대한 리소스 ID를 가진다.


CWinApp:OnFileNew

 - document 객체 생성

 - main frame의 ID를 IDR_???TYPE으로 변경, 차일드 프레임 윈도우 생성

 - CDocument::OnNewDocument, CView::OnInitialUpdate, CChildFrame::ActiveFrame호출


virtual BOOL CDocument::OnNewDocument();

참고주소 : http://msdn.microsoft.com/ko-kr/library/ewt90sw3(VS.80).aspx

File->New에 명령으로 인한 프레임 워크에 의해 호출.

SDI일 경우 존재하는 Document를 다시 초기화한다.

MDI일 경우 프레임워크는 document를 초기화하기 위해 이 함수를 호출하고 새로운 document를 생성한다.

이 함수에서 프로그래머가 원하는 초기화 코드를 놓아야 한다.

리턴 : Document가 성공적으로 초기화되면 TRUE, 아니면 FALSE


virtual void CView::OnInitialUpdate( );

참고주소 : http://msdn.microsoft.com/ko-kr/library/xc7fw3a0(VS.80).aspx

document에 처음으로 뷰가 부착된 후 뷰가 처음 보이기 전에 프레임 워크에 의해 호출.

document에 관한 정보를 요구하는 한 번에 초기화를 수행한다.


virtual CFrameWnd* CFrameWnd::GetActiveFrame( );

참고주소 : http://msdn.microsoft.com/ko-kr/library/bk1bcdy9(VS.80).aspx

MDI 프레임 윈도우의 활성화된 MDI 차일드 윈도우의 포인터를 얻기 위해 사용한다.

리턴 : 활성화된 MDI 차일드 윈도우의 포인터. 활성화된 윈도우가 없거나 SDI면 묵시적으로 this 포인터가 리턴될 것이다.


하나의 Document에 새로운 View 추가하기

 - 창(Window)/새창(New Window) 메뉴 선택시

 - 차일드 프레임과 뷰 객체 생성

 - CView::OnInitialUpdate, CFrameWnd::ActivateFrame호출


virtual void CView::OnInitialUpdate( );

참고주소 : http://msdn.microsoft.com/ko-kr/library/xc7fw3a0.aspx

뷰가 처음으로 표시되기 전에 document가 뷰에 붙은 후에 프레임워크에 의해 호출된다.

document에 관한 정보를 요구하는 한 번의 초기화를 수행한다.


virtual void CFrameWnd::ActivateFrame(int nCmdShow = -1);

참고주소 : http://msdn.microsoft.com/ko-kr/library/6wywwt36(VS.80).aspx

프레임 윈도우를 활성화하고 복구해서 사용자에게 볼 수 있고 이용가능하게 한다.

nCmdShow : CWnd::ShowWindow에 전달할 파라미터를 지정한다. 기본적으로 프레임은 보이고 정확하게 복구된다.


다중 Document Template

 - GetFirstTemplatePosition, GetNextDocTemplate 함수를 이용하여 각 템플릿을 얻을 수 있다.

 - File/ New 메뉴 실행시 각 Document type이 list box 내에 표시되어 선택할 수 있다.


UpdateAllViews();