02장. MFC 개요 및 아키텍처
* MFC (Microsofrt Foundation Class)
윈도우 애플리케이션을 생성하기 위한 애플리케이션 프레임워크
(Application Framework)
* 애플리케이션 프레임워크
애플리케이션 구조를 정의하고
애플리케이션의 많은 작업을 처리
* MFC 라이브러리
Win32 API 위에 구축
Win32 API
윈도우 시스템에서 애플리케이션들이 사용할 수 있는 함수
MFC
윈도우 시스템의 공통적인 객체들을 표현하는 기본적인 클래스
전체 API를 포함하지 않음
주요 구성 요소와 공통 구성 요소만 포함
c++로 만들어져 있음
* MFC의 헝가리안 표기법
클래스 : C로 시작
멤버 변수 : m_로 시작
멤버 함수 : 대문자로 시작
전역 함수 : 접두사 Afx로 시작 (Application Framework의 약자)
* MFC 프로그램의 구조
1. SDI (Single Document Interface)
2. MDI (Multiple Document Interface)
SDI
한 개의 도큐먼트 프레임 윈도우만을 사용하는
단일 문서 기반 프로그램
MDI
여러 개의 도큐먼트 프레임 윈도우를 사용
* SDI 애플리케이션의 구조 (클래스)
CWinApp
애플리케이션 전체를 나타내는 클래스
CFrameWnd
외부 프레임을 나타내는 클래스
메뉴, 상태 표시줄, 도구바 등
CView
작업 영역 혹은 애플리케이션의 클라이언트를 나타내는 클래스
CDocument
애플리케이션 내부에서
데이터를 읽고, 저장하는 기능을 가진 클래스
단일 탬플릿 애플리케이션이라고도 부른다
* MDI 애플리케이션의 구조 (클래스)
CWinApp
애플리케이션 전체를 나타내는 클래스
CMDIFrameWnd
외부 프레임을 나타내는 클래스
메뉴, 상태 표시줄, 도구바 등
CMDIChildWnd
자식 윈도우의 외부 프레임을 나타내는 클래스
CView
자식 윈도우의 클라이언트 또는 작업 영역을 나타내는 클래스
CDocument
애플리케이션 내부에서
데이터를 읽고, 저장하는 기능을 가진 클래스
여러 템플릿 애플리케이션이라고도 한다
* MFC 애플리케이션 마법사
애플리케이션의 시작 파일 생성
단순한 조작으로
자동으로 프로젝트를 만들어주고
자동으로 코딩
상속과 클래스 생성 포함
* OLE (Lbject Linking and Embedding)
애플리케이션 간에 데이터를 공유할 수 있도록 해주는 기능
ex)
워드 문서 안에 있는 엑셀 그래프를 클릭하면
엑셀 프로그램이 실행된다
윈도우의 멀티 태스킹 (다중 작업) 기능을 효과적으로 제공
* ActiveX 컨트롤
기존 컴포넌트를 이용하여
인터렉티브한 웹 페이지와 네트워크를 구축할 수 있도록 해주는 컨트롤
ActiveX 기술에서 파생됨
* 솔루션 탐색기
프로젝트에 추가된 파일들을 보여줌
구성 요소는
1. 소스 파일 (cpp)
2. 헤더 파일
4. 리소스 파일 (rc 파일, 아이콘 파일, 툴바 이미지 파일 등)
프로젝트의 대략적인 구성을 알 수 있음
* 클래스 뷰
프로젝트 안에 있는 클래스를 보여줌
클래스의 구성도 볼 수 있다
(멤버함수와 멤버변수)
* 리소스 뷰
프로젝트의 리소스 정보를 보여줌
리소스
프로젝트를 구현하기 위해
부수적으로 필요한 자원
ex) 대화 상자, 메뉴, 툴바, 아이콘 글
Dialog
대화상자를 보여줌
Icon
프로그램에서 사용되는 아이콘들을 보여줌
Menu
프로그램에서 사용할 메뉴에 대한 정보를 보여줌
String Table
프로젝트에서 사용되는 문자열에 대한 리스트 보여줌
Toolbar
프로그램에서 사용되는 툴바에 대한 정보를 보여줌
* Visual C++ 단축키
소스 코드 컴파일
ctrl + F7
현재 열린 소스 파일만 컴파일
프로젝트 실행
ctrl + F5
현재 프로젝트를 실행
컴파일이 안 돼 있으면
컴파일과 링크를 한 후 실행
프로젝트 필드
ctrl + shift + B
현재 프로젝트 안에 있는 소스파일을 모두 컴파일하고
라이브러리를 링크시킨다
프로젝트 디버그
F5
디버그 시작
브레이크 포인트가 없으면
실행 명령과 유사
브레이크 포인트 지정
F9
현재 커서가 위치한 소스 코드에 브레이크 포인트 지정
브레이크 포인트를 지정하면
디버그 할 때 이 지점에서 실행을 멈춤
* MFC 애플리케이션 아키텍처
CObject
1. CCmdTarget
(1)CWinTread
-1- CWinApp
(2) CWnd
-1- CFrameWnd
-2- CView
-3- CDialog
(3) CDocument
* CObject 클래스
클래스 루트
MFC의 최상위 기본 클래스
기능
1. 메모리에 클래스를 설정
2. 직렬화 지정
3. Run-time 클래스 정보
ㄴ 현재 클래스의 상태를 확인하고 오류 정리
4. 객체가 유효한지 검사
5. 컬렉션 클래스에 대한 호환성 제공
* 직렬화 (Serialization)
메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위해
적합한 형식으로 변환하는 것
데이터의 메모리 구조는
1. 값 형식 데이터 (Value Type)
2. 참조 형식 데이터 (Reference Type)
으로 구성돼 있는데
디스크에 저장하거나 통신할 수 있는 값 형식 데이터 뿐
프로그램이 종료되면 실행 중에 할당했던 메모리가 해제되고 없어지기 때문
따라서 각 주소값이 가지는 데이터를 값 형식으로 변환할 필요가 있다
* 컬렉션 클래스
컬렉션을 다루기 위한 클래스
컬렉션
데이터의 집합, 그룹을 의미
하위 인터페이스로 LIst, Set이 있다
다량의 데이터를 다루기 위한 것 (배열처럼)
* CCmdTarget
MFC의 메시지 맵 아키텍처를 지원하기 위한 기저 클래스
윈도우 메시지를 위한 맵 (WM_ 같은)
* CWinThread
윈도우를 스레드로 구동될 수 있게 하는 클래스
윈도우 시스템의 멀티태스킹을 가능하게 해줌
프로세스
메모리에 적재된 프로그램
스레드 (thread)
프로세스가 여러 가지의 작업으로 나눠진 것
멀티 스레드
하나의 프로세스가 여러 가지 스레드를 가질 수 있는 것
* CWinApp
애플리케이션 자체를 나타내는 클래스
템플릿 안에 있는 FrameWnd, View, Document 클래스를 관리
1. SDI는 CSingleDocTemplate 클래스를
2. MDI는 CMultiDocTemplate 클래스를
이용하여 템플릿을 관리한다
* CWnd 클래스
화면에 출력되는 모든 윈도우의 기본 클래스
기능
1. 메시지 맵의 기능을 지원
2. 윈도우를 구동하기 위한 모든 기능을 내포
뷰, 프레임, 대화상자 클래스 등이 CWnd를 상속받은 클래스
* CFrameWnd
윈도우의 외곽 경계를 정의하는 클래스
상태 표시줄, 도구 상자 포함
SDI 프로젝트에서는
CFrameWnd 클래스로부터 상속받아
CMainFrame 클래스를 생성
MDI 프로젝트에서는
CFrameWnd 클래스로부터 상속받아
CMDIFrameWnd와 CMDIChildWnd클래스 생성
CMDIFrame
윈도우 전체 영역 나타냄
CMDIChildWnd
자식 윈도우를 나타냄
* CView
윈도우의 작업 영역을 정의하는 기본 클래스
작업 영역으로 들어오는 메시지를 처리
* !! CDialog !!
대화 상자의 기본이 되는 클래스
* CDocument
데이터를 저장하고 제어하는 클래스
데이터 처리를 담당
애플리케이션의 내부 담당
* CString 클래스
문자열 클래스
const TCHAR* LPCTSTR 대신 사용 가능
GetLength()
문자열 길이 반환
IsEmpty()
문자열 버퍼가 비어 있는가?
Empty()
문자열 버퍼 비우기
GetAt()
특정 위치의 문자 값 얻기
SetAt()
특정 위치에 문자 삽입
MakeUpper()
소문자를 대문자로 바꾸기
MakeLower()
대문자를 소문자로 바꾸기
Format()
형식을 지정하여 문자열에 넣는다
CString.Format(_T())
ex)
CString str;
str.Format(_T("마우스 위치는 : (%d, %d)), 100, 100);
Find()
문자열에서 특정 문자나 부분 문자열 찾기
WM_SIZE
윈도우의 크기가 변경될 떄 발생하는 윈도우 메시지
* Invalidate()
윈도우의 클라이언트 영역을 다시 그리는 함수
윈도우 창을 갱신
View 클래스에서 사용
WM_PAINT를 직접 호출하지 않음
OnDraw() 함수를 직접 호출해서는 안 됨
호출 순서는
update region -> 시스템 -> WM_PAINT -> OnDraw()
1. 전체 클라이언트 영역을 윈도우의 update region에 더함
2. 그러면 시스템이 WM_PAINT를 호출
3. WM_PAINT가 OnDraw() 호출
* OnDraw()
WM_PAINT 메시지의 메시지 핸들러 함수
!! 윈도우에 출력하는 코드는 OnDraw()에 구현해야 한다 !!
화면에 출력하고 싶은 내용을 OnDraw()에 작성한다
WM_PAINT 메시지는 화면에 보이는 모습이 변할 때마다
메시지가 날라온다
상속 순서는
CWnd.OnPaint() -> CView.OnDraw()
virtual void OnDraw(CDC * pDC) = 0;
pDC
DC (Device Context)를 가지는 포인터
* TextOut()
문자열을 지정된 위치에 출력하는 함수
BOOL TextOut(int x, int y, const CString & str)
간단하게
TextOut(x좌표, y좌표, 문자열)
사용은 보통
pDC->TextOut(int, int, CString);
* CRect 클래스
사각형의 좌측 상단과 우측 하단의 좌표를 저장하기 위한 클래스
left, top, right, bottom으로 이루어져 있다
* GetClientRect()
윈도우의 클라이언트 영역의 크기를 얻는 함수
BOOL GetClientRect(LPRECT lpRect);
* DrawText()
영역을 정하고
출력 형식에 맞게 문자열을 출력
int DrawText(CString & str, LPRECT lpRect, UNIT nFormat)
str
출력될 문자열
lpRect
화면에 출력할 사각형 영역의 좌표
nFormat
출력 형식의 플러그
* DrawText()의 출력 형식 플러그
DT_TOP
상단으로 정렬
DT_BOTTOM
하단으로 정렬
DT_LEFT
좌측으로 정렬
DT_RIGHT
우측으로 정렬
다만 DT_SINGLELINE과 함께 써야 한다
DT_CENTER
가로 중앙에 정렬
DT_VCENTER
세로 중앙에 정렬
다만 DT_SINGLELINE과 함께 써야 한다
DT_SINGLELINE
한 줄로 출력
행 바꿈과 라인 피드를 무시
DT_NOCLIP
클리핑 없이 문자 출력
DT_EXPANDTABS
문자열에 있는 탭이 포함되어 있을 때 공백 출력
* CPoint 클래스
2차원 좌표계의 x, y 값을 지정하는 클래스
1. LONG x
2. LONG y
로 구성돼 있음
생성자 함수 원형은
1. CPoint(int x, int y)
2. CPoint(POINT initPt)