본문 바로가기

카테고리 없음

mfc winapp 클래스

[강좌2]CWinApp 클래스 입력일자 2001.12.19
2.CWinApp 클래스

프로그램을 실행시킨다는 것은 CWinApp 클래스에서 상속 받은 클래스인 CMyApp클래스의 인스턴스를 하나 생성 시키는 것이다. 이 클래스에서 다른 클래스의 인스턴스를 실행 시키고, 프로그램을 구동시키고, 메세지를 뿌려주고 하는 등의 일을 해 준다.

CWinApp 클래스가 수행하는 기능을 단순화 시켜보면, 인스턴스가 생성되면서 다음의 멤버변수를 차례로 호출한다.

InitInstance(); //프로그램을 초기화 하는 루틴
Run(); //무한루프를 돌면서 메세지를 뿌려줌
ExitInstance(); //InitInstance()함수에서 초기화 했던 작업을 해제


AppWizard에 의해 생성된 코드는 다음과 같다.

1)헤더파일(My.h)

헤더파일에는 클래스를 선언하는 내용이 나온다.
class CMyApp:public CWinApp
{
public:
     CMyApp();
//Overrides
public:
     virtual BOOL InitInstance();
};


제일 첫 줄에서 CMyApp 클래스가 CWinApp클래스에서 상속을 받아 만들어졌음을 나타낸다.
멤버함수인 CMyApp() 함수는 클래스명과 같으므로 생성자이다.
다른 멤버함수인 InitInstance()의 앞에는 virtual이 붙어 있어 이 함수가 CMyApp 클래스에서 새로 추가된 함수가 아니라, 원래부터 CWinApp 클래스에 존재하던 함수를 오버라이딩 한 것임을 알 수 있다.

2)소스파일(My.cpp)

소스파일에는 클래스의 멤버함수를 실제로 구현하는 부분이 나온다.

#include "stdafx.h"
#include "My.h"
#include "MainFrm.h"
#include "MyDoc.h"
#include "MyView.h"

가장 상단에서는 우선 헤더파일들을 인클루드 하는 부분이 나오는데 기본적으로 'stdafx.h'는 반드시 해줘야 한다.여기에서 MFC 클래스들의 선언, 상수정의, 매크로 등 MFC를 이용해 프로그래밍 하는데 필요한 모든것이 정의되어 있다.
그리고, 소스파일에서 어떤 클래스를 참조했으면 그 클래스가 선언되어 있는 헤더파일을 반드시 인클루드 해 주어야 하는데, 위에서 stdafx.h를 제외한 나머지가 그것이다.


다음 함수는 CMyApp 클래스의 생성자 함수이다.
CMyApp::CMyApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
아직은 여기서 아무런 작업도 하고 있지 않지만, 나중에 이클래스에서 멤버변수를 추가하게 되면, 여기에 멤버변수를 초기화하는 작업을 넣으라는 주석이 달려있다.

다음은 대단히 의미가 있는 한 줄이다.
CMyApp theApp;

이것은 CMyApp 클래스의 인스턴스를 theApp라는 인스턴스 명으로 선언한 것이다. 이 한줄을 제외한 코드의 나머지 부분은 모두 클래스를 선언,정의하는 부분이다. 프로그램이 실행되는 순간에 실제 인스턴스를 생성하겠다는 것은 오직 여기 한 줄 뿐이다. 즉, 이 한 줄이 프로그램 전체를 실행시키고 있는 것이다.

인스턴스의 선언을 함수 밖에서 했기 때문에 이것은 전역변수가 된며, 프로그램이 시작되면서 theApprk 생성되고, 종료되는 순간 소멸된다. 

다음은 오버라이딩된 멤버함수 InitInstance()가 정의된 부분이다.

BOOL CMyApp::InitInstance()
{
......
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
          IDR_MAINFRAME,
          RUNTIME_CLASS(CMyDoc),
          RUNTIME_CLASS(CMainFrame), 
          RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
......
return TRUE;
}

이 함수에서는 프로그램을 초기화하느 각종 루틴이 들어가게 된다. 이부분에서 가장 중요한 부분은, AFX 클래스인 도큐먼트 클래스, 프레임 윈도우 클래스, 뷰 클래스를 엮어서 등록하는 루틴이다.

위에서 도큐먼트 클래스, 프래임 윈도우 클래스, 뷰 클래스로 각각 CMyDoc, CMainFrame, CMyView 클래스를 사용할 것임을 명시하고 있다.
이러한 정보를 CSingleDocTemplate 클래스에 설정한 후 CWinApp 클래스의 멤버함수인 AddDocTemplate 함수를 호출하여 CWinApp 클래스와 연결 시킨다.
(InitInstance 함수가 후행하느 기능에 대해서는 다음에 더욱 자세히 할 것이다.)