본문 바로가기

윈도우프로그래밍

[윈도우 프로그래밍] MFC 개요 및 아키텍처

MFC의 개요

-윈도우 애플리케션을 생성하기 위해 만들어진 C++ 클래스 라이브러리

-클래스는 모두 대문자 C로 시작

-여러 단어가 하나의 클래스 이름일 경우 각 단어별로 첫 글자를 대문자로 표기 -> CWndApp

-멤버 변수는 m_로 시작, 멤버 함수는 대문자로 시작

-전역 함수는 Afx라는 접두어 붙음.

-MFC의 이점 5가지

MFC 프로그램 구조(SDI, MDI)

-SDI: 단일 문서 기반, 4개의 클래스 존재

-> CWinAPP(애플리케이션 전체), CFrameWnd(애플리케이션에서 메뉴, 상태표시줄, 도구바 등 외부 프레임), CView(애플리케이션의 클라이언트 또는 작업 영역), CDocment(애플리케이션 내부 데이터 읽고, 저장)

 

-MDI: 다중 문서 기반, 5개의 클래스 존재

-> WinAPP(애플리케이션 전체), CMDIFrameWnd(애플리케이션에서 메뉴, 상태표시줄, 도구바 등 외부 프레임), CMDIChildWnd(애플리케이션에서 자식 윈도우의 외부 프레임),

CView(애플리케이션에서 자식 윈도우의 클라이언트 또는 작업 영역), CDocment(애플리케이션 내부 데이터 읽고, 저장)

이렇게 세 개가 하나의 템플릿으로 구성, 이러한 템플릿이 하나 이상으로 구성되어있음.

 

-MFC: Application Class

-> 템플릿을 포함하고 한 개의 인스턴스를 포함하는 Application Class가 있음

 

MFC클래스의 기본 구조

-상속 구조가 매우 논리적, 구조적으로 짜여있다.

-CObject 클래스: MFC의 최상위 기저 클래스, 메모리에 클래스 설정하는 기능 가짐 + 직렬화의 지원, 런타임 클래스 정조, 객체의 검사 출력, 컬렉션 클래스에 대한 호환성 제공

-CCmdTarget 클래스: 메시지 전송 담당 클래스, WM_COMMAND(메뉴바) OLE 메시지만 담당

-CWnd 클래스: 화면에 보이는 윈도우들은 모두 CWnd에서 상속 받음. 윈도우의 최상위 클래스(CView, CDialog, CFrameWnd)

-CWinThread 클래스: 윈도우가 스레드로 돌아갈 수 있도록 구동되는 클래스(윈도우 앱이 스레드 단위로 돌아갈 수 있게~)

-> 한 개의 프로그램을 독립적으로 움직이려면 한 개 프로그램은 하나 이상의 CWinThread 포함해야 합니다.!!!

-CWinApp 클래스: 하나의 프로그램을 포함하고 관장하는 클래스

-CDocument 클래스: 애플리케이션에서 사용되는 데이터를 저장하고 제어하는 클래스. 데이터를 디스크에서 읽어오거나 디스크에 저장하는 부분

 

1.  실습 2-2 간단한 MFC 프로젝트

-윈도우창 사이즈 변경할 때마다 그때의 사이즈 값 얻기 위해서 WM_SIZE

 

-OnDraw()는이미 코드에 포함되어있고, 실제 화면 출력되는 부분, WM_PAINT 메시지에 의해서 호출

-Invalidate() 함수 WM_PAINT 메시지 호출 + WM_PAINT 메시지는 OnDraw() 함수 호출

-Invalidate(TRUE)는 윈도우의 뒷배경 전부 지우고 BeginPaint() 함수 이용해서 다시 그림,

Invalidate(FALSE)는 뒷배경 그대로 남겨두고 바뀐 부분만 그림. 디폴트 인수는 TRUE

-> 화면 갱신 역할하므로 모든 메시지에 넣어줄 것!!

-OnDraw() 함수: 실제 화면을 복원하는 루틴을 이 함수 안에 삽입! 메시지 핸들러 함수가 아닌 가상함수

-> WM_PAINT() 함수가 날아올 때마다 OnPaint() 함수와 OnDraw() 함수가 둘 다 호출되어서 화면을 복원

 

-화면에 문자열 출력할 때 !!

-CDC::TextOut() 함수: 문자열을 지정된 위치에 출력

TextOut(int x, int y, str)

-CDC::DrawText() 함수: 영역 정하고 이 영역에 출력 형식에 맞게 문자열 출력

DrawText(str,rect(출력할 영역 좌표), 출력형식 플러그)

-> 출력형식 플러그에 여러 종류가 있다. (윈도우32와 똑같음)

  pDC -> TextOut(x좌표, y좌표, 문자열) 이나 pDC -> DrawText(문자열, rect(영역), 영역 내에 어떻게 표현할지(가운데, 한줄 ...))

 

-CString 클래스는 문자열을 처리하는 클래스이고, 멤버 함수 중에서 Format은 문자열에 형식을 갖춰서 문자를 넣습니다.문자열.Format(“ ”); 문자열에 문자 저장하기

CString str;

str.Format(_T("마우스 위치 X: %d, Y: %d", 200, 200)

-CRect 클래스는 Windows Rect 구조와 유사하며 사각형의 좌측상단과 우측하단의 좌표를 저장하기 위한 클래스입니다.

-> GetClientRect() 함수 는 윈도우의 클라이언트 영역의 크기를 얻는 함수입니다.

CRect rect;
GetClientRect(&rect); //구조체의 영역 크기 가져오기
pDC->DrawText(m_strOutput, rect, ~);

 

연습 문제

실습 2-2 간단한 MFC 프로젝트 수정