Professional Documents
Culture Documents
학습 목표
Programming Homework#1
추후 공지
1
MFC 발전 과정 (1/3)
연도 개발 도구 MFC 버전 주요 특징
1992 MS C/C++ 7.0 1.0 16비트 윈도우 API를 클래스화, OLE 1.0 지원
1993 비주얼 C++ 1.0 2.0 도큐먼트/뷰 구조 도입, DDX/DDV 지원
AppWizard/ClassWizard를 이용한 코드 생성 지원
1993 비주얼 C++ 1.5x 2.5x OLE 2.0 지원, ODBC 클래스 추가
속성 페이지/시트 추가
1994 비주얼 C++ 2.x 3.x 32비트 윈도우 API로 전환, 멀티스레드 지원
소켓/MAPI 클래스 추가
1995 비주얼 C++ 4.x 4.x 컨트롤 클래스 추가, DAO와 32비트 ODBC 지원
(mfc40.dll) 인터넷 관련 클래스 추가
1997 비주얼 C++ 5.0 4.21 ATL 추가, 액티브 도큐먼트 지원
(mfc42.dll) DAO 3.5/ODBC 3.0 지원, 인터넷 프로그래밍 지원 향상
2
MFC 발전 과정 (2/3)
연도 개발 도구 MFC 버전 주요 특징
MFC와 ATL의 통합 강화
CException 클래스를 추상 클래스로 변경
CString과 BSTR 사이의 변환 방법 변경
비주얼 C++ .NET CFile 클래스 변경(64비트 옵셋 지원)
2002 7.0
(mfc70.dll) CTime 클래스 변경(64비트 시간 지원)
부울(Boolean) 표현식 의미 변경(BOOL → bool)
ON_MESSAGE 매크로의 매개변수 타입 변경
OLE DB 템플릿 변경
비주얼 C++ .NET 2003
2003 7.1 ATL 일부 변경
(mfc71.dll)
ATL 업그레이드
비주얼 C++ 2005 Windows Forms 지원
2005 8.0
(mfc80.dll) CTime 클래스 변경(1970년 이후 지원 → 1900년 이후
지원)
비주얼 C++ 2008
2007 9.0 윈도우 비스타 공용 컨트롤 지원
(mfc90.dll)
비주얼 C++ 2008
2008 9.0 현대적 UI 지원을 위한 다수의 클래스 추가
Feature Pack
3
MFC 발전 과정 (3/3)
연도 개발 도구 MFC 버전 주요 특징
MFC 라이브러리와 정적 링크 시 실행 파일 크기 축소
비주얼 C++ .2012
2012 11.0 각종 버그 수정, 윈도우 XP/서버 2003 지원 중단
(mfc110.dll)
(SP1 설치 시 윈도우 XP/서버 2003용 코드 생성 지원)
4
MFC 주요 특징 (1/3)
5
MFC 주요 특징 (2/3)
6
MFC 주요 특징 (3/3)
7
MFC 구성 요소 (1/2)
◼ 구성 요소
매크로와 전역 변수 및 전역 함수
8
MFC 구성 요소 (2/2)
◼ 클래스 계층도
9
CObject 클래스
◼ CObject 서비스
서비스 이름 기능
◼ 실행 시간 클래스 정보 기능 추가
// MyClass.h
class CMyClass : public CObject
{
DECLARE_DYNAMIC(CMyClass)
...
};
// MyClass.cpp
#include "MyClass.h"
IMPLEMENT_DYNAMIC(CMyClass, CObject)
...
11
실행 시간 클래스 정보 (2/2)
◼ 실행 시간 클래스 정보 사용 예
BOOL IsMyClass(CObject *pObj)
{
// pObj가 가리키는 객체가 CMyClass 타입인지 확인한다.
if(pObj->IsKindOf(RUNTIME_CLASS(CMyClass)){
...
}
else{
...
}
}
12
동적 객체 생성 (1/2)
◼ 동적 객체 생성 기능 추가
// MyClass.h
class CMyClass : public CObject
{
DECLARE_DYNCREATE(CMyClass)
public:
CMyClass(); // 기본 생성자 반드시 있어야 한다.
...
};
// MyClass.cpp
#include "MyClass.h"
IMPLEMENT_DYNCREATE(CMyClass, CObject)
...
13
동적 객체 생성 (2/2)
◼ 동적 객체 생성 사용 예
// 객체를 동적으로 생성한다.
CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CMyClass);
CObject* pObject = pRuntimeClass->CreateObject();
14
직렬화 (1/2)
◼ 직렬화 기능 추가
// MyClass.h
class CMyClass : public CObject
{
DECLARE_SERIAL(CMyClass)
public:
CMyClass(); //기본 생성자 반드시 필요
virtual void Serialize (CArchive& ar); // 가상 함수 재정의
...
};
15
직렬화 (2/2)
◼ 직렬화 기능 추가 (cont’d)
// MyClass.cpp
#include "MyClass.h"
IMPLEMENT_SERIAL(CMyClass, CObject, 1)
16
3단계 매크로
단계 매크로 이름 사용 목적 사용 위치
클래스 선언부
DECLARE_DYNAMIC 실행 시간 클래스 정보
(*.H)
1
클래스 정의부
IMPLEMENT_DYNAMIC 실행 시간 클래스 정보
(*.CPP)
실행 시간 클래스 정보, 클래스 선언부
DECLARE_DYNCREATE
동적 객체 생성 (*.H)
2
실행 시간 클래스 정보, 클래스 정의부
IMPLEMENT_DYNCREATE
동적 객체 생성 (*.CPP)
실행 시간 클래스 정보, 클래스 선언부
DECLARE_SERIAL
동적 객체 생성, 직렬화 (*.H)
3
실행 시간 클래스 정보, 클래스 정의부
IMPLEMENT_SERIAL
동적 객체 생성, 직렬화 (*.CPP)
17
타당성 점검 (1/2)
◼ 타당성 점검 기능 추가
// MyClass.h
class CMyClass : public CObject
{
// 멤버 변수
int m_start;
int m_end;
public:
virtual void AssertValid( ) const;
...
};
18
타당성 점검 (2/2)
◼ 타당성 점검 기능 추가 (cont’d)
// MyClass.cpp
#include "MyClass.h"
19
집합 클래스와의 호환성
CMapWordToOb, CMapStringToOb,
맵
CMap(템플릿 클래스)
20
MFC 전역 함수
함수 이름 기능
AfxMessageBox() 메시지 상자를 표시한다.
AfxGetApp() 응용 프로그램 객체의 주소를 리턴한다.
AfxGetMainWnd() 메인 윈도우 객체의 주소를 리턴한다.
AfxGetAppName() 응용 프로그램의 이름을 리턴한다.
AfxGetInstanceHandle() 인스턴스 핸들을 리턴한다.
AfxRegisterWndClass() 윈도우 클래스를 등록한다.
AfxBeginThread() 스레드를 시작한다. (13장에서 소개)
AfxEndThread() 스레드를 종료한다. (13장에서 소개)
21
AfxMessageBox()
◼ 사용 예
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox(_T("마우스 클릭!“));
}
22
AfxGetApp(), AfxGetMainWnd(),
AfxGetAppName()
◼ 사용 예: 1장 HelloMFC에 추가
#include <afxwin.h>
#include <locale.h>
...
BOOL CHelloApp::InitInstance()
{
_tsetlocale(LC_ALL, _T("")); // TRACE() 매크로에서 한글(유니코드) 출력에 필요!
m_pMainWnd = new CMainFrame;
m_pMainWnd->ShowWindow(m_nCmdShow);
return TRUE;
}
...
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
TRACE(_T("응용 프로그램 객체 주소: %p = %p\n"), AfxGetApp(), &theApp);
TRACE(_T("메인 윈도우 객체 주소: %p = %p\n"), AfxGetMainWnd(), theApp.m_pMainWnd);
TRACE(_T("응용 프로그램 이름: %s\n"), AfxGetAppName());
}
23
AfxGetApp(), AfxGetMainWnd(),
AfxGetAppName()
◼ 결과
24
AfxGetInstanceHandle()
◼ 사용 예
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
// 인스턴스 핸들값은 실행 파일이 로드된 가상 메모리의
// 주소를 나타낸다.
TRACE("실행 파일이 로드된 가상 메모리의 주소: %p\n",
AfxGetInstanceHandle());
}
25
MFC 응용 프로그램 구조 (1/2)
프레임 윈도우
26
MFC 응용 프로그램 구조 (2/2)
툴바
뷰 클라이언트
영역
상태바
27
AppWizard를 이용한
MFC 응용 프로그램 생성 (1/8)
◼ 프로젝트 실행 결과
28
AppWizard를 이용한
MFC 응용 프로그램 생성 (2/8)
◼ 프로젝트 종류 선택
29
AppWizard를 이용한
MFC 응용 프로그램 생성 (3/8)
◼ MFC 애플리케이션 종류 : 단일문서 선택
30
AppWizard를 이용한
MFC 응용 프로그램 생성 (4/8)
◼ 다음단계
31
AppWizard를 이용한
MFC 응용 프로그램 생성 (5/8)
◼ 다음단계
32
AppWizard를 이용한
MFC 응용 프로그램 생성 (6/8)
◼ 다음단계
33
AppWizard를 이용한
MFC 응용 프로그램 생성 (7/8)
◼ 마침
34
AppWizard를 이용한
MFC 응용 프로그램 생성 (8/8)
◼ 코드 추가
35
주요 클래스
36
코드 분석
37
코드 분석
◼ 뷰 클래스
뷰의 기능 정의
주요 역할
– 화면에 데이터 출력
– 사용자 입력(마우스, 키보드,…) 처리
ChildView.h/ChildView.cpp 참고
38
요약
프레임 윈도우
CFrameWnd OnCreate() – 뷰를 생성한다.
클래스
뷰
CWnd OnPaint()- 화면에 출력한다.
클래스
39