MFC란?

- Microsoft사에서 만든 C++기반 윈도우 라이브러리이다.

- Win32 API 는 C기반이지만  MFC Programming은 C++ 기반이다.




왜 MFC를 사용하는가?

- 객체지향 (코드의 재사용)

- 다양한 함수 제공한다.

- MFC Framework에 Win32 API를 섞어 사용 (사실 Win32 API를 클래스화하여 wrapping한 것으로도 봄)




CWnd Class (중요)

- CWnd는 MFC의 부모라 불리는 CObject 클래스와 CCmdTarget 클래스를 상속받은 클래스이다.

- CCmdTarget 클래스는 메세지 맵과 관련된 코드가 구 현된다. ( WinProc()의 switch case문을 대체하고 자 도입된 MFC구조이다.)

- CWnd는 MFC가 제공한 모든 윈도우 클래스의 기본 기능이다.

- Windows 자체를 객채화한 클래스이다보니 CWnd 객체를 선언하여 초기화하고 생성하면 화면에 창이 뜨는거와 같다.




함수 

역할 

Create() / CreateEx() 

 둘 다 윈도우를 생성하는 함수이다. CreateEx()는 추가로 확장 속성을 갖고있다. 

PreCreateWindow() 

윈도우를 생성하기 직전 호출되는 가상 함수로 재정의하여 생성되는 윈도우의 속성을 변경하는 코드를 추가할 수 있다. 

GetStyle() / GetExStyle()

윈도우의 기본 스타일과 확장 스타일을 반환하는 함수이다. 

PreSubclassWindow() 

서브 클래싱 직전에 호출되는 가상 함수이다. 

GetSfeHwnd() 

생성된 윈도우의 핸들을 반환하는 함수이다. 




MFC 마법사로 생성한 프로젝트의 기본 클래스 구조

- CAboutDlg = 제품 정보를 출력하는 대화 상자 클래스이다.

- CMainFrame = 툴바와 상태바를 생성한다.

- C프로젝트App, C프로젝트Doc 클래스는 응용 프로그램 자체와 문서를 객체화한 클래스이다.



예제 어디를 살펴봐도 WInMain(()함수나 그 비슷한 함수를 찾을 수없다. 하지만 프로젝트.cpp 파일을 열면 theApp라는 전역 객체가 선언된것을 확인할 수 있다.



CWinApp class

- CWnd 클래스와 마찬가지로  CCmdTarget 클래스를 상속받다가 CWinThread 클래스를 상속받는다.

- CWinApp 클래스는 응용 프로그램 자체를 의미하는 클래스임이다.



 멤버 변수

의미 

m_hInstance 

현재 응용 프로그램의 인스턴스 핸들이다. WinMain() 함수의 첫번째 파라미터인 hInstance와 같은 것이다. 

m_lpCmdLine

WinMain() 함수의 lpCmdLine 파라미터와 가 ㅌ은 것입니다. 프로그램을 실행하였을 때 명령줄 정보가 들어 있다. 

m_nCmdShow 

WinMain() 함수의 마지막  파라미터인 nCmdShow와 같은것 

m_pAcitveWnd 

응용 프로그램의 최상위 프레임 윈도우에 대한 포인터. SDI 구조에서 이 값은 CMainFrmae 클래스의 객체 포인터이다. 

m_pszAppName 

응용 프로그램의 제목에 해당하는 문자열 포인터이다. 

m_pszExeName 

빌드한 실행 파일에서 활장자(.exe)를 제외한 파일명이다. 


- CWinApp 클래스에는 다양한 메서드가 있는데 이중 InitInstance(), ExitInstance(), Run() 메서드는 반드시 알아야한다.

- CWinApp 클래스의 Run() 메서드가 호출되는 시점 메시지 루프가 시작되는 시점이다. Run() 메서드가 반환하면 응용 프로그램은 종료된다 이건 Win32 API에서 WM_QUIT 메시지가 발생한것과 같다.


- InitInstance() 메서드는 응용 프로그램이 초기화되는 시점에서 호출된다. 그리고 대부분 재정의되어 있으며, 직접 코드 수정이 가능. 프로그램의 시작과 동시에 메모리를 할당한다든지, 시 스템 리소스를 할당받아야 한다면 여기에 넣는게 바람직


- ExitInstance() 메서드는 응용 프로그램을 종료하는 시점에서 호출된다. Run()함수가 반환되는 시점에서 호출이 된다. 메모리나 시스템 리소스 반환하는 코드는 여기게 넣는게 보편적




CFrameWnd class

- SDI 문서/뷰 구조를 갖는 MFC 응용 프로그램을 개발할 대 최상위 프레임 윈도우에 해당하는 CMainFrame이며 이 클래스는 CFrameWnd 클래스를 상속받아 마든다.

- MDI에서는 CMDIFrameWnd 클래스로 대체된다.



- CFrmaeWnd 클래스는 프레임이 있는 윈도우가 가져야 할 기본 기능을 정의한 클래스라 할 수 있다.

- 도구 모음이나, 상태표시줄 같이 특수한 윈도우를 자 식 윈도우로 취할 수 있다.


- OnCreate() 메서드는 WM_CREATE 메시지 핸들러 함수이다. 메인 윈도우가 생성되는 시점에서 호출되는 함수라는 뜻.그리고 그 시점에서 자신의 자식 윈도우인 도구모음, 상태표시줄을 생성한다. 




CDocument class

- MFC는 문서와 관련된 처리를 개발자가 논리적으로 분리할 수 있도록 CDocument 클래스를 제공한다.

- 이클래스는 다양한 가상함수를 제공하여 개발자로 하여금 자료를 처리할 수있도록 도와준다. 예를 들어 사용자가 파일 열기 메뉴를 선택하여 파일을 열면 자동으로 어떤 함수가 호출하도록 구조적으로 지원한다.


- OnNewDocument() 문서가 오픈되었을 경우 실행되는 메서드.

- SetModifyiedFlag() 문서가 변경되었음을 설정/해제하는 역할을 한다.

- 이외에도 OnOpenDocument(), OnCloseDocument(), OnSaveDocument() 등.




메세지 맵

- Win32 API 윈도우 프로시저 함수에서 볼 수있는 switch case를 대체하는 역할이다.

- 특정 메세지가 발생했을때 어떤 함수를 호출해야하는지 명시하는 매크로의 집합체이다.


//CMain Frame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)


BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

ON_WM_CREATE()

END_MESSAGE_MAP()


- BEGIN_MESSAGE_MAP() 매크로와 END_MESSAGE_MAP() 매크로를 이용하여 시작과 끝을 명시한다. ON_WM_CREATE() 매크로는 WM_CREATE()메시지 핸들러 함수를 등록할 경우 추가되는 매크로이다. Visual C++을 이용하면 메시지맵을 직접 손대는 경우는 흔하지 않으며 보통은 Wizard를 통해 변경된다. 


- Win32 API를 단순 클래스 포장한것에 지나지 않는다는 평가를 받기도 하지만 Win32 API구조를 훌륭한 방법으로 객체지향적인 구조로 바꿔 주는 것 중 하나가 메시지 맵이라고 평하해도 과언이 아니다.


-결국 특정 메시지가 바 ㄹ생하면 우리가 최종적으로 재정의한 함수를 호출하며, 이 함수에서는 재정의된 상위 계층의 함수를 명ㅈ시적으로 호출함으로써 MFC의 코드와 우리가 작성한 코드 모두가 동작한다. 












+ Recent posts