• 검색 결과가 없습니다.

2.2 MFC 프로그램의 구조

N/A
N/A
Protected

Academic year: 2022

Share "2.2 MFC 프로그램의 구조"

Copied!
53
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

2.1 MFC의 개요

2.2 MFC 프로그램의 구조 2.3 Visual C++의 시작

실습 2-1 Application Wizard 익히기 2.4 SDI 템플릿

2.5 MDI 템플릿

2.6 MFC 애플리케이션 아키텍처

실습 2-2 간단한 MFC 프로젝트 만들기

(2)

MFC

윈도우 애플리케이션을 생성하기 위해 만들어진 C++

클래스 라이브러리

애플리케이션 프레임워크를 제공

MFC의 개요

(3)

MFC의 이점

윈도우 프로그램 전문가로 만들어 준다.

개발시간을 단축시키고, 이식성이 강한 코드를 작성

• ActiveX, OLE, 인터넷 프로그래밍 같은 기술 지원

응용 프로그램(데이터베이스, 네트워크)을 손쉽게 작 성

강력한 사용자 인터페이스를 지원

MFC의 개요

(4)

MFC의 표기법

헝가리안 표기법을 사용한다.

클래스는 모두 C로 시작한다.

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

멤버 변수는 m_로 시작하고, 멤버 함수는 대문 자로 시작한다.

전역 함수는 Afx라는 접두어가 붙는다.

• Afx는 Application Framework의 약자로

Microsoft사에서 MFC를 개발했던 팀의 이름이다.

MFC의 개요

(5)

SDI 애플리케이션의 구조

MFC 프로그램의 구조

(6)

SDI 애플리케이션의 구조

Template :

윈도우로 출력되는 형태

Main Frame :

윈도우 외곽 경계를 담당하고

메뉴, 툴바, 상태바를 가지고 있음

View 윈도 :

실제 화면 처리를 담당

문자 출력, 그래픽 출력 등

Document :

디스크에서 데이터를 읽고 저장

MFC 프로그램의 구조

(7)

MDI 애플리케이션의 구조

MFC 프로그램의 구조

(8)

MDI 애플리케이션의 구조

여러 개의 SDI형태 프로그램

Main Frame

독립적으로 설정되어 있고 그 안에 template

Template

• Child Frame

• View Window

• Document

MFC 프로그램의 구조

(9)

MFC 형태의 프로그램 구조

Application Class

• MFC프로그램은 템플릿을 포함하고 한 개의 인스턴스를 포함하는 Application class가 있 음

MFC 프로그램의 구조

(10)

Visual C++의 특징

다양한 SDK 형태의 라이브러리를 제공한다

강력한 MFC가 있다

강력한 마법사가 있다

Visual C++란

(11)

MFC 응용 프로그램 마법사 익히기

프로젝트를 만들 때 실행되는 프로그램

자동으로 소스를 만들어 주는 프로그램?

기존의 소스를 단순하게 복사하여 코딩 하는 프로그램?

기존의 있는 클래스를 상속 받는 또 하나의 클래스를 생성?

Class CMainFrame : CFrameWnd {

}

실습 2-1

(12)

MFC 응용 프로그램 마법사

• 응용프로그램 종류 단계

(13)

MFC 응용 프로그램 마법사

• 복합문서 지원 단

(14)

MFC 응용 프로그램 마법사

• 개체 삽입의 예

(15)

MFC 응용 프로그램 마법사

• 문서 템플릿 속성 단계

(16)

MFC 응용 프로그램 마법사

• 데이터베이스지원 단계

(17)

MFC 응용 프로그램 마법사

• 사용자인터페이스 기능 단계

(18)

MFC 응용 프로그램 마법사

• 고급기능 단계

(19)

MFC 응용 프로그램 마법사

• 생성된 클래스 단계

(20)

MFC 응용 프로그램 마법사

• MDI형 프로젝트 만들기

(21)

만들고자 하는 기본적인 프로젝트를 생성 해주고 그 안에 필요한 클래스 생성

클래스에 기본적인 내용을 코딩

기본적인 코딩시간을 절약 하므로 빠른 프 로젝트 완성

응용 프로그램 마법사 사용 도중 실수로 옵션을 선택하지 않았을 경우 소스에서 새 로 추가할 수 있다.

MFC 응용 프로그램 마법사

(22)

프로젝트 워크스페이스의 구성

클래스

• MFC 클래스를 상속 받은 클래스

솔루션 탐색기

클래스 소스가 설정되어 있는 파일들

소스파일 cpp

헤더 파일 h

리소스

프로그램에 필요한 메뉴, 아이콘, 문자열, 대화 상자 같은 자원

Project Workspace

(23)

Project Workspace

프로젝트에 설정되어 있는 클래스별로 출력, 해당 항목을 선택하면 수정 가능

클래스 뷰

프로젝트에 설정되어 있는 파일 리스트 출력, 해당 항목을 선택하여 수정 가능

솔루션 탐색기

프로젝트에 설정되어 있는 메뉴, 대화 상자, 문자열, 아이콘, 비트맵 등 자원의 리스트 출력, 해당 항목 선택 수정 가능

리소스 뷰

내 용 항 목

(24)

클래스 뷰 화면

(25)

리소스 뷰 화면

(26)

솔루션 탐색기 화면

(27)

템플릿 클래스

• 애플리케이션의 여러 자원들과 메인 프레임 클래스, View 클래스, Document 클래스 등을 하나의 묶 음으로 가지는 클래스.

템플릿

SDI 템플릿

(28)

애플리케이션 클래스의 인스턴스 얻기

ex) CExSDIApp *pApp = (CExSDIApp *)AfxGetApp();

• 애플리케이션 클래스를 얻을 때는 애플리케이션 클 래스의 포인터 변수를 생성

• AfxGetApp() 라는 함수를 이용하여 애플리케이션 클 래스의 인스턴스를 얻는다.

• 마지막으로 형 전환

다른 클래스의 접근 방법에서도 형 전환은 역시 필요하다.

SDI 템플릿

(29)

메인 프레임 클래스의 인스턴스 얻기

메뉴와 툴바, 상태바 등의 상태를 바꾸기 위해 서는 메인 프레임 클래스에 접근

ex) CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();

메인 프레임의 인스턴스를 얻을 때

AfxGetMainWnd() 함수를 이용하고 형 전환

SDI 템플릿

(30)

뷰 클래스의 인스턴스 얻기

ex) CExSDIView *pView = (CExSDIView *)pFrame->GetActiveView();

클래스의 포인터를 얻기 위해서는 GetActiveView() 함수를 사용

그런데 이 함수는 CFrameWnd(CMainFrame) 의 멤버 함수

함수를 사용하기 위해서는 먼저

CMainFrame 클래스를 얻고 이 클래스의 멤버 함수인GetActiveView() 함수를 사용

SDI 템플릿

(31)

도큐먼트 클래스의 인스턴스 얻기

ex) CExSDIDoc *pDoc = (CExSDIDoc *)pFrame->GetActiveDocument();

도큐먼트 클래스의 인스턴스를 얻는 방법은 함 수가 GetActiveDocument() 라는 것 외에는 뷰 클래스의 인스턴스를 얻는 방법과 같다.

SDI 템플릿

(32)

MDI

• 하나의 프로그램에서 여러 개의 문서 객체를 가지는 애플리케이션의 형태

템플릿

CMultiDocTemplate* pDocTemplate;

pDocTemplate = new CMultiDocTemplate(

IDR_PRACTITYPE,

RUNTIME_CLASS(CPractice5_3Doc),

RUNTIME_CLASS(CChildFrame), // MDI child frame RUNTIME_CLASS(CPractice5_3View));

AddDocTemplate(pDocTemplate);

MDI 템플릿

(33)

자식 프레임 클래스의 인스턴스 얻기

ex) CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();

자식 프레임 클래스의 인스턴스를 얻기 위해 메 인 프레임의 멤버함수인 GetActiveFrame()함 수를 이용

함수를 사용하기 위해서는 먼저

CMainFrame 클래스를 얻고 이 클래스의 멤버 함수인 GetActiveFrame() 함수를 사용

MDI 템플릿

(34)

MFC의 계층적 구조 형태

MFC Application Architecture

(35)

CObject 클래스 (최상위 클래스 )

메모리에 클래스를 설정하는 기능

클래스를 할당하기 위한 new 연산자가 오버로딩

• /MFC/Include/Afx.h에 설정

클래스의 기능과 종류를 알 수 있는 함수가 있음

MFC Application Architecture

(36)

CCmdTarget클래스

MFC Application Architecture

(37)

CWnd클래스

화면에 보이는 윈도들은 모두 CWnd 에서 상속 받음

가장 많이 사용되는 클래스

윈도우의 최상위 클래스

상속해서 사용하지 직접 CWnd 클래스를 사용하지는 않는다.

윈도우를 구동하는 모든 기능을 가진 함수가 있다.

MFC Application Architecture

(38)

CWndThread 클래스

윈도가 스레드로 돌아갈 수 있도록 구동 되는 클래 스

스레드는 독립적인 형태로 구동 되는 하나의 모듈

개의 프로그램을 독립적으로 움직이려면 한 개 의 프로그램은 한 개 이상의 CWinThread를 포함 해야 한다

• Multi-tasking이 가능

CWndApp 클래스

개의 프로그램을 포함하고 관장하는 클래스

MFC Application Architecture

(39)

CDocument 클래스

데이터를 디스크에서 읽어 들이거나 디스크 에 저장하는 부분을 담당하는 클래스

주로 알고리즘을 저장

나중에 다른 프로그램에서 재사용이 용이

MFC Application Architecture

(40)

CWnd를 상속 받은 클래스들

(41)

간단한 MFC 프로젝트 만들기

MFC를 이용할 것

클래스 마법사를 이용

키보드와 마우스에 대한 메시지 처리

키보드와 마우스의 동작에 따라 텍스트를 출 력하는 프로그램을 작성하는 것

윈도우의 크기가 변경되었을 때 윈도우의 크 기를 출력

실습 2-2

(42)

프로그램 작성 순서

1) SDI 기반의 프로젝트 생성

2) 윈도우 크기가 변경될 때 윈도우 크기를 출력

필요한 변수 선언

WM_SIZE 에 대한 메시지 핸들러 함수 생성

윈도우 크기를 출력(OnDraw() 함수)

3) 마우스와 키보드 동작에 따라 출력할 텍스트를 저 장할 변수 추가

4) 왼쪽 마우스에 대한 메시지를 처리

WM_LBUTTONDOWN에 대한 메시지 핸들러 함수 생성

5) 오른쪽 마우스에 대한 메시지를 처리

WM_RBUTTONDOWN에 대한 메시지 핸들러 함수 생성

실습 2-2

(43)

6) 키보드에 대한 메시지를 처리

WM_KEYDOWN에 대한 메시지 핸들러 함수 생성

7) 마우스 이동과 드래그에 대한 메시지를 처리

WM_MOUSEMOVE에 대한 메시지 핸들러 함수 생성

8) 윈도우에 텍스트를 출력

OnDraw()함수에 출력 코드 추가

9) 프로그램 실행

실습 2-2

(44)

CString 클래스

함 수 내 용

GetLength 설정된 문자의 길이를 반환한다

IsEmpty 현재 클래스에 문자열 버퍼가 비어 있는가?

Empty 문자열을 삭제하여 버퍼를 비운다

GetAt 문자열의 특정 위치의 문자 값을 얻는다

SetAt 문자열의 특정 위치에 새로운 문자열을 삽입한다

Compare 문자열과 인자의 문자열을 비교한다

MakeUpper 문자열의 소문자를 대문자로 바꾼다

MakeLower 문자열의 대문자를 소문자로 바꾼다

Format 문자열에 형식을 갖추어 문자들을 넣는다

Find 문자열에서 특정 문자나 문자열을 찾는다

(45)

• Invalidate() 함수는 시스템이 WM_PAINT 메시지를 호출

• WM_PAINT 메시지는 OnDraw() 함수를 호출

• Invalidate(TRUE)는 윈도우의 background를 전부 지 운 후 BeginPaint() 함수를 이용하여 다시 그린다.

• Invalidate(FALSE) 함수는 background는 그대로 남겨 두고 바뀐 부분만 그린다.

디폴트 인수는 TRUE이다.

Invalidate( ) 함수

(46)

OnPaint() 메시지 핸들러 함수이다.

WM_PAINT 메시지가 날아올 때마다

OnPaint() 함수와 OnDraw() 함수가 둘 다 호출되어 화면을 복원

메시지 핸들러 함수가 아닌 가상함수

OnDraw( ) 함수

(47)

• CRect클래스는 windows Rect 구조와 유사하며 사각형 의 좌측상단과 우측하단의 좌표를 저장하기 위한 클래 스

• RECT의 구조

typedef struct tagRECT {

LONG left; // 사각형의 왼쪽 상단의 x좌표 LONG top; // 사각형의 왼쪽 상단의 y좌표 LONG right; // 사각형의 오른쪽 하단의 x좌표 LONG bottom; // 사각형의 오른쪽 하단의 y좌표

} RECT;

CRect 클래스

(48)

GetClinetRect() 함수는 윈도우의 클라이언트 영역의 크기를 얻는 함수이다.

함수의 원형은 다음과 같다.

BOOL GetClientRect(LPRECT lpRect);

• lpRect : 클라이언트 좌표를 얻기 위한 포인터로 왼쪽 및 상단을 0으로 하고 오른쪽과 하단은 윈 도우의 너비와 높이를 포함한다.

GetClientRect( ) 함수

(49)

TextOut() 함수는 문자열을 지정된 위치에 출 력하는 함수이다.

함수의 원형은 다음과 같다.

BOOL TextOut( int x, int y, const CString& str );

• x : 문자열이 출력될 x 좌표

• Y : 문자열이 출력될 y 좌표

• str : 출력될 문자열

CDC::TextOut( ) 함수

(50)

실습 2-2 실행 결과

(51)

실습 2-2 실행 결과

(52)

<실습 2-2>에서 작성한 프로그램에 다음의 기 능을 추가하는 프로그램을 작성하라.

• 프로그램에 마우스를 이동하였을 마우스를 따라 다니 면서 마우스의 현재 좌표를 윈도우에 출력하는 프로 그램을 작성해 보자.

연습문제 2-1

(53)

연습문제 2-1 실행 결과

참조

관련 문서