728x90
반응형


정말 오랜만에 다시 꺼내든 MFC 윈도우 프로그래밍 책, 다시 여유시간이 생겨 공부해보려고 한다. 지난번에는 SDK 프로그램 기본구조에 대해서 살펴보았는데 이번엔 그와 비슷한 MFC 프로그램 기본 구조를 살펴보려고 한다.


SDK 기본 구조의 골격은 다음과 같다.


1. 윈도우 클래스를 정의(초기화)하고 운영체제에 등록한다.

2. 윈도우를 생성하고 화면에 보이게 한다.

3. 메시지 루프를 구동한다.

4. 윈도우 프로시저에서 메시지를 처리한다.


그와 비슷한 MFC 기본 구조의 골격은 다음과 같다.


1. 응용 프로그램 클래스를 정의한다.

2. 메인(프레임) 윈도우 클래스를 정의한다.

3. 응용 프로그램 객체를 선언한다.

4. 메시지 맵을 선언한다. 


MFC 응용 프로그램을 개발 할 때는 일반적으로 AppWizard를 이용하여 프로그램 뼈대를 이루는 기본 코드를 생성하고 여기에 추가 코드를 덧붙이는 식으로 진행된다. 




위와 같이 코딩 한 후 빌드를 하게되면 오류가 발생한다. MFC가 제공하는 기능을 사용하려면 MFC 라이브러리와 링크해야 하며, 대게 생성 코드 크기를 줄이기 위해 DLL 버전을 사용한다. 이 때 아래와 같은 설정을 해주어야 한다. [Project] - [Settings]






결과 화면은 다음과 같다.






<afxwin.h>는 여러 헤더 파일을 포함하고 있는데, 이전에 작성하였던 windows.h 파일도 포함하고 있다. CWinApp 클래스는 응용 프로그램의 초기화 코드, 메시지 루프, 종료 코드를 제공하며, CFrameWnd 클래스는 메인 윈도우의 기능을 제공한다. 대부분의 MFC 응용 프로그램은 CWinApp와 CFrameWnd 클래스를 그대로 사용하지 않고 C++ 상속 기능을 이용해 새로운 클래스를 만들고 일부 기능을 재정의해서 사용한다.


또한, MFC 응용 프로그램은 CWinApp 클래스를 상속받아 클래스를 만들고, 이 클래스로부터 객체 하나를 전역 변수로 생성한다. 이 객체를 응용 프로그램 객체라고 부른다.


SDK 프로그램과는 달리 MFC 프로그램은 WinMain() 함수가 존재하지 않는다. 이는 MFC 라이브러리에서 내부적으로 제공된다. 프로그램이 시작되면 WinMain() 함수는 응용 프로그램 객체의 주소를 알아내 여기에 속한 멤버 함수를 내부적으로 정한 순서에 따라 차례대로 호출하게 된다.


MFC 프로그램은 하나의 전역 응용 프로그램 객체, 여러 종류의 클래스 선언과 정의로 이루어지게 된다. 


또한, SDK 프로그램은 들어온 메세지를 switch 문을 사용하여 처리하지만, MFC 프로그램은 메세지 처리를 위해 메시지 맵을 이용하여 처리하며, WM 로 시작하는 윈도우 메세지를 처리하게 된다. 





728x90
반응형