MDI 프로그램 구조
MDI 형태의 프로그램 작성할 때 CWinApp, CFrameWnd, CChildWnd, CView, CDocument 클래스가 필요. 이 5가지 클래스를 상속받아 프로그램을 작성한다.
Application : CWinApp 클래스를 상속받아 작성한 클래스
MainFrame : CFrameWnd 클래스를 상속받아 작성한 클래스, 부모 윈도우 외곽 경계담당, 메뉴, 툴바, 상태바를 가짐
ChildFrame : CChildWnd 클래스를 상속받아 작성한 클래스, 자식 윈도우의 외곽 경계담당
View : CView 클래스를 상속받아 작성한 클래스, 윈도우의 실제 화면 처리를 담당
Document : CDocument 클래스를 상속받아 작성한 클래스, 데이터를 저장하는 기능을 가짐
Document와 View는 쌍으로 움직인다(데이터를 보관하고, 적당히 처리해서 화면에 출력하는 형식)
ChildFrame, View, Document를 하나로 묶은 것(리소스 정보도 같이 묶는다)을 Template(윈도우를 출력하는 형태)이라고 한다. MDI 프로그램에서는 만들어진 Template을 복제하여 화면에 출력한다. 또한 여러개의 Template을 가질 수 있다. MDI 프로그램은 여러개의 SDI을 포함한 프로그램
MDI형태에서는 SDI형태와 다르게 자식프레임(CChildFrame)과 View윈도우(CDemoMdiView), 도큐먼트(CDemoMdiDoc)클래스가 템플릿으로 설정되고, 메인프레임은 따로 설정된다.
①~⑥까지는 CDemoMdiApp클래스의 InitInstance() 함수에서 실행된다.
②
자식 윈도우로 사용할 템플릿을 생성한다(CChildFrame, CDemoMdiView, CDemoMdiDoc, 자식윈도우의 Resource ID - 자식 윈도우용으로 쓰일 메뉴, 아이콘, 문자열).
④
부모 윈도우의 메인프레임을 로드하여, 어플리케이션 클래스(CDemoMdiApp)에 등록한다.
⑤
어플리케이션 셸이 초기화될 때 자식 프레임, View 윈도우, Document가 결합되어 하나의 템플릿으로 형성.
⑦, ⑧
CMainFrame의 OnCreate() 함수에서 실행된다.
CDemoMdiApp의 InitInstance() 함수 분석
// CDemoMdiApp 초기화
BOOL CDemoMdiApp::InitInstance()
{
// 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요.
// InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록 설정
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// OLE 라이브러리를 초기화
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
// ActiveX 콘트롤을 사용할 수 있게 초기화
AfxEnableControlContainer();
SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));
LoadStdProfileSettings(4); // MRU를 포함하여 표준 INI 파일 옵션을 로드
// 위 그림의 ②,③
// 응용 프로그램의 문서 템플릿을 등록. 문서 템플릿은 문서, 프레임 창 및 뷰 사이의 연결 역할을 함.
// MDI에서 템플릿을 만들 때 CMultiDocTemplate 사용
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_DemoMdiTYPE, // 자식 프레임 리소스
RUNTIME_CLASS(CDemoMdiDoc),
RUNTIME_CLASS(CChildFrame), // 사용자 지정 MDI 자식 프레임
RUNTIME_CLASS(CDemoMdiView));
// 문서 템플릿 등록
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// 위 그림의 ④
// 메인 MDI 프레임 창을 만듬.
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
delete pMainFrame;
return FALSE;
}
m_pMainWnd = pMainFrame;
// 표준 셸 명령, DDE, 파일 열기에 대한 명령줄을 구문 분석
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// 위 그림의 ⑤
// 이부분이 실행되면서 템플릿이 서로 연결되고 만들어진다.
// 모든 템플릿이 만들어지고 ProcessShellCommand에 의해서 각 템플릿 클래스를 메모리에 할당하면,
// 메인 윈도우가 화면에 출력될 때, 자식 윈도우도 함께 출력된다.
// 명령줄에 지정된 명령을 디스패치한다.
if (!ProcessShellCommand(cmdInfo)) return FALSE;
// 위 그림의 ⑥
// 메인 창이 초기화되었으므로 이를 표시하고 업데이트
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
return TRUE;
}
[출처] [MFC] MDI 프로그램 구조 (박컴 SE147 기) |작성자 타르
'개발지식창고 > MFC' 카테고리의 다른 글
CArchive클래스 (0) | 2012.04.14 |
---|---|
MFC SDI 객체 간의 접근 (0) | 2012.04.14 |
MFC에서 콘솔창 띄워기 (디버그용도) (0) | 2012.02.05 |
[MFC] CWebBrowser2 클래스 추가하기 (0) | 2012.01.11 |
VS2005 -> VS2008 변환시 주의할점 (0) | 2011.07.22 |