CFirstApp 클래스의 InitInstance 멤버 함수에는 많은 초기화 관련 코드가 들어 있다. 이 중 실제 프로그램 동작과 크게 상관이 없는 코드는 제외하고 프로그램 동작에 큰 영향을 끼치는 코드에 대해서만 살펴보겠다.
먼저 InitInstance 상단부에서 다음 문장을 찾을 수 있다.
CWinApp::InitInstance();
이 문장은 CFirstApp 클래스의 상위 클래스인 CWinApp 클래스의 InitInstance 함수를 강제로 호출하는 문장이다. 원래 C/C++ 문법 상 부모와 자식 클래스에 동일한 함수가 있을 경우 자식 클래스의 함수만을 수행한다. 그러나 MFC 응용 프로그램을 생성하기 위해서는 CWinApp 클래스의 InitInstance 함수에 있는 코드가 호출되어야 할 필요가 있다. CWinApp 클래스의 InitInstance 함수에서 모든 MFC 응용 프로그램에 공통으로 필요한 초기화 작업을 수행하기 때문이다. 그러므로 CFistApp 클래스에서 강제로 상위 클래스인 CWinApp 클래스의 InitInstance 함수를 호출한 것이다.
다음은 도큐먼트 템플릿을 생성하는 코드에 대하여 살펴보자. Visual Studio 도움말에서는 문서 템플릿이라는 용어를 사용하는데 이 책에서는 두 용어를 함께 사용한다. 사실 도큐먼트 템플릿을 나타내는 MFC 클래스 이름에 직관적으로 DocTemplate이라는 영문을 사용하고 있는데 굳이 Doc 단어만 문서로 바꿔서 문서 템플릿이라고 부르는 것이 더 어색할 수 있기 때문이다. 아래는 도큐먼트 템플릿을 생성하는 코드이다. 간략한 코드 설명을 위해서 pDocTemplate 변수가 제대로 생성되었는지 체크하는 if 문은 제외하였다.
CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_FirstTYPE, RUNTIME_CLASS(CFirstDoc), RUNTIME_CLASS(CChildFrame), // 사용자 지정 MDI 자식 프레임입니다. RUNTIME_CLASS(CFirstView)); AddDocTemplate(pDocTemplate);
다중 문서 인터페이스의 경우 CMultiDocTemplate 클래스를 이용하여 도큐먼트 템플릿을 생성한다. 도큐먼트 템플릿을 생성하기 위해서는 차일드 프레임 클래스, 도큐먼트 클래스, 뷰 클래스가 필요하고, 이들 클래스에서 사용될 리소스의 아이디가 필요하다. 생성된 도큐먼트 템플릿은 AddDocTemplate 함수를 이용하여 등록한다.
다음은 메인 프레임 윈도우를 생성하고, 이를 화면에 나타내는 코드에 대하여 살펴보자.
CMainFrame* pMainFrame = new CMainFrame; pMainFrame->LoadFrame(IDR_MAINFRAME); m_pMainWnd = pMainFrame; pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow();
First 프로그램의 메인 윈도우 기능은 CMainFrame 클래스가 담당한다. new 연산자를 이용하여 CMainFrame 클래스의 인스턴스를 동적 생성한 후, LoadFrame 함수에서 IDR_MAINFRAME 리소스 정보를 이용하여 프레임 윈도우를 만든다. 새로 만든 메인 프레임 윈도우는 ShowWindow 함수를 이용하여 화면에 나타낸다.
이 외에도 InitInstance 함수에서는 레지스트리 키를 등록한다거나 쉘 명령어에 대한 처리 등의 작업을 수행한다. InitInstance 함수의 전체 기능과 ExitInstance 함수에서 하는 일은 First.cpp 소스 코드를 참고하기 바란다.