41
Visual C++ Programming How to draw? Department of Digital Contents Sang Il Park

Visual C++ Programming How to draw?

Embed Size (px)

DESCRIPTION

Visual C++ Programming How to draw?. Department of Digital Contents Sang Il Park. Outline. Review How to draw with MFC. The simplest MFC application. VC++ Framework. CFrameWnd. CChildView. CDocument. 윈도우의 프레임 ( 틀 ) 을 관리. 데이터를 보여주는 윈도우. 데이터를 저장 , 처리 ( 눈에 안보임 ). - PowerPoint PPT Presentation

Citation preview

Page 1: Visual C++ Programming How to draw?

Visual C++ ProgrammingHow to draw?

Department of Digital Contents

Sang Il Park

Page 2: Visual C++ Programming How to draw?

Outline

• Review• How to draw with MFC

Page 3: Visual C++ Programming How to draw?

The simplest MFC application

Page 4: Visual C++ Programming How to draw?

VC++ Framework

CFrameWnd

CChildView

CDocument

윈도우의 프레임 ( 틀 ) 을 관리 데이터를 보여주는 윈도우 데이터를 저장 , 처리( 눈에 안보임 )

CWinApp : 위의 세 오브젝트를 묶어 주고 , 프로그램을 구동 시킴 ( 눈에 안보임 )

메시지 루프를 돌림

Page 5: Visual C++ Programming How to draw?

프로그램 내부 구조

theApp(CSimpleApp : CWinApp)

m_pMainFrame(CMainFrame : CFrameWnd)

m_wndView(CChildView : CWnd)

Page 6: Visual C++ Programming How to draw?

Hungarian Notation

• 변수의 이름을 짓는 방법 :– 의미를 알 수 있게– 일관되게

• Hungarian Notation: – Microsoft 에서 따르는 변수 이름 작명법

Page 7: Visual C++ Programming How to draw?

Hungarian Notation

Page 8: Visual C++ Programming How to draw?

8

데이터 타입들

• API 데이터 타입 - 기본형

데이터 타입

BOOL 또는 BOOLEANBYTE, WORD, DWORD, LONG

U*

HANDLE

H*

정의

TRUE 또는 FALSE

8 비트 , 16 비트 , 32 비트 , 32 비트 ( 모두 unsigned)

unsigned *예 ) UCHAR, UINT, ULONG, ...

32 비트 핸들

* 을 가리키는 핸들예 ) HBITMAP( 비트맵 ), HBRUSH( 브러시 ), HCURSOR( 커서 ), HDC( 디바이스 컨텍스트 ), HFONT( 폰트 ), HICON( 아이콘 ), HINSTANCE( 인스턴스 ), HMENU( 메뉴 ), HPEN( 펜 ), HWND( 윈도우 )

Page 9: Visual C++ Programming How to draw?

9

데이터 타입들

• API 데이터 타입 - 기본형 (cont’d)

데이터 타입

P* = LP*

(L)PSTR, (L)PCSTR

(L)PTSTR, (L)PCTSTR

COLORREF

정의

* 에 대한 포인터예 1) PBOOL, PBYTE, PLONG, ...예 2) LPBOOL, LPBYTE, LPLONG, ...

ANSI 문자열

ANSI 또는 유니코드 문자열

32 비트 RGB (red, green, blue 각각 8 비트 ) 색상값

Page 10: Visual C++ Programming How to draw?

응용 프로그램 실행순서

CSimpleApp theApp;

WinMain() // MFC 내부에 숨겨짐

{

theApp.InitInstance(); // 초기화

theApp.Run(); // 메시지 루프

theApp.ExitInstance(); // 종료

}

Page 11: Visual C++ Programming How to draw?

How to draw with MFC

Page 12: Visual C++ Programming How to draw?

도스 시절 게임하기…

• In 1980s, before the birth of the “windows 95”– MS-DOS (Disk Operating System)

– Graphics Card: CGA(4 색 )/EGA(16 색 )/VGA(256색 )

CGA 용 게임CGA

도스는 그래픽스 카드와 상관이 없다 ?도스는 그래픽스 카드와 상관이 없다 ?

게임회사가 그래픽스 카드 드라이버를 각각 제공게임회사가 그래픽스 카드 드라이버를 각각 제공

Device-Independent 개념의 시작

Page 13: Visual C++ Programming How to draw?

13

GDI 와 디바이스 컨텍스트 (1/5)

• 출력 시스템을 설계할 때 고려할 사항– Device-independent

• 모니터 , 비디오 카드 , 프린터 등 출력에 사용되는 주변 장치가 변경되는 경우에도 프로그램을 수정할 필요가 없어야 한다 .

– Multi-tasking• 화면이나 기타 출력 장치를 직접 접근 (Direct Access) 하거나

독점해서 사용하는 것을 운영체제 차원에서 막아야 한다 .

Page 14: Visual C++ Programming How to draw?

14

GDI 와 디바이스 컨텍스트 (2/5)

• GDI(Graphics Device Interface)– 운영체제의 하위 시스템 중 하나– 응용 프로그램의 요청을 받아서 실제 출력 장치에 대한

출력을 담당

응용 프로그램 GDI출력 장치

( 화면 , 프린터 등 )

장치 독립적 장치 의존적

Page 15: Visual C++ Programming How to draw?

15

GDI 와 디바이스 컨텍스트 (3/5)

• 화면 출력할 때 고려할 사항– 클라이언트 영역에 출력하려면 화면에 해당하는 윈도우

위치를 알아야 한다 .– 화면에 여러 개의 윈도우가 있을 때 출력 결과가 다른

윈도우의 영역을 침범하지 않아야 한다 .– 현재 출력할 화면이 다른 윈도우에 가려졌다면 출력을

할 수 없어야 한다 .

Page 16: Visual C++ Programming How to draw?

16

GDI 와 디바이스 컨텍스트 (4/5)

• 디바이스 컨텍스트 (DC, Device Context)– GDI 가 생성하고 관리하는 데이터 구조체– 멀티태스킹 ( 멀티스레딩 ) GUI 환경에서 발생할 수 있는

여러 상황을 고려한 출력 가능

Page 17: Visual C++ Programming How to draw?

17

GDI 와 디바이스 컨텍스트 (4/5)

• 윈도우 응용 프로그램의 출력 과정1. 응용 프로그램 : 디바이스 컨텍스트 요청2. 운영체제 (GDI): 디바이스 컨텍스트 생성 및 핸들 (

포인터 ) 제공3. 응용프로그램 : 디바이스 컨텍스트에 그림 그리기4. 운영체제 (GDI): 그림 그리는 상황 검토 후 출력

Page 18: Visual C++ Programming How to draw?

18

GDI 와 디바이스 컨텍스트 (5/5)

• 윈도우 응용 프로그램의 출력 과정 (cont'd)

응용 프로그램

디바이스컨텍스트 GDI

장치드라이버

출력 장치( 화면 , 프린터 등 )

Page 19: Visual C++ Programming How to draw?

그림 그리는 부분은 어디에 ?

1. WM_PAINT 메시지 핸들러 (OnPaint) 함수 속

2. 아무데나…

Page 20: Visual C++ Programming How to draw?

화면 그리기 연습

• Project 생성 – Single Document– No Document/View Architecture Support

• CChildView 의 WM_PAINT 메시지 핸들러 수정

void CChildView::OnPaint() {

CPaintDC dc(this); dc.Rectangle(50,50,250,250);dc.Ellipse(100,100,200,200);

}

Page 21: Visual C++ Programming How to draw?

화면 그리기 연습

Page 22: Visual C++ Programming How to draw?

WM_PAINT??

• WM: Windows Message – MFC 에서 제공하는 기본 메시지– 화면 내 창이나 마우스 , 키보드과 관련된 메시지

• WM_PAINT– 화면을 다시 그릴 필요가 있다고 판단될 경우 발생되는

메시지– “ 무효영역 (invalid region) 이 생겼다 !”

Page 23: Visual C++ Programming How to draw?

23

무효 영역 (1/3)

• 화면을 다시 그려야 하는 상황

Page 24: Visual C++ Programming How to draw?

24

무효 영역 (2/3)

• WM_PAINT 메시지 발생 상황– 윈도우가 생성될 때– 윈도우의 크기가 변경될 때– 최소화 또는 최대화 되었을 때– 다른 윈도우가 가렸다가 드러날 때

• 무효 영역 생성을 강제로 발생

void CWnd::Invalidate (BOOL bErase = TRUE);void CWnd::InvalidateRect (LPCRECT lpRect, BOOL bErase

= TRUE);

Page 25: Visual C++ Programming How to draw?

25

무효 영역 (3/3)

• WM_PAINT 메시지 처리– API 를 사용할 때

– MFC 를 사용할 때

hdc = BeginPaint(hwnd, &ps);TextOut(hdc, 100, 100, “Hello, MFC”);EndPaint(hwnd, &ps);return 0;

void CMainFrame::OnPaint(){ CPaintDC dc(this); dc.TextOut(100, 100, “Hello, MFC”);}

Page 26: Visual C++ Programming How to draw?

26

출력 방법 비교

• SDK– 윈도우 운영체제에게 디바이스 컨텍스트를 요청

• BeginPaint(hwnd, &ps);

– 얻어낸 디바이스 컨텍스트 핸들을 사용하여 출력• TextOut(hdc, 100, 100, “Hello, MFC”);

– 운영체제에게 디바이스 컨텍스트 사용이 끝났음을 알림• EndPaint(hwnd, &ps);

• MFC– 디바이스 컨텍스트 객체 생성 (this pointer 이용 )

• CPaintDC dc(this)

– 객체의 멤버 함수를 호출하여 출력• dc.TextOut( … )

Page 27: Visual C++ Programming How to draw?

27

다양한 디바이스 컨텍스트 클래스

메타 파일 (Metafile) 에 출력할 때 CMetaFileDC

윈도우의 전체 영역 ( 클라이언트 영역 + 비 클라이언트 영역 ) 에 출력할 때

CWindowDC

클라이언트 영역에 출력할 때(WM_PAINT 메시지 핸들러를 제외한 다른 모든 곳에서 사용 )

CClientDC

클라이언트 영역에 출력할 때(WM_PAINT 메시지 핸들러에서만 사용 )

CPaintDC

용도 클래스 이름

Page 28: Visual C++ Programming How to draw?

28

클래스 계층도

Page 29: Visual C++ Programming How to draw?

29

CPaintDC 클래스

• 오로지 WM__PAINT 메시지 핸들러에서만 사용– OnPaint()

• CPaintDC 사용 예

void CChildView::OnPaint() { CPaintDC dc(this); // ...}

Page 30: Visual C++ Programming How to draw?

30

DC 의 그리기 관련 맴버 함수

• 도형 그리기

사각형에 내접하는 타원을 그린다 .Ellipse()

사각형을 그린다 . Rectangle()

기능이름

dc.Rectangle (x1, y1, x2, y2);dc.Ellipse (x1, y1, x2, y2);

(x1, y1)

(x2, y2)

Page 31: Visual C++ Programming How to draw?

CPaintDC 사용 연습

• 다음과 같은 그림을 그려보자

Page 32: Visual C++ Programming How to draw?

32

CClientDC 클래스

• WM_PAINT 메시지 핸들러 이외의 부분에서 사용

• CClientDC 사용 예

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)

{CClientDC dc(this);// ...

}

Page 33: Visual C++ Programming How to draw?

CClientDC 사용 연습

• 마우스 버튼이 눌렸을 때 그림을 그려보자 !

1. 마우스 버튼이 눌리는 메시지 핸들러 추가2. CClientDC 객체 생성3. 생성된 DC 객체를 이용하여 그리기

Page 34: Visual C++ Programming How to draw?

34

CWindowDC 클래스

• CWindowDC 사용 방법– CPaintDC, CClientDC 클래스와 동일

• 원점 위치

(0, 0) CWindowDC

(0, 0) CPaintDC, CClientDC

Page 35: Visual C++ Programming How to draw?

CWindowDC 사용 연습

• 다음과 같은 그림을 그려보자

Page 36: Visual C++ Programming How to draw?

36

CMetaFileDC 클래스

• 메타 파일 (Metafile)– GDI 명령어를 저장할 수 있는 파일

• CMetaFileDC 사용 방법– CMetaFileDC 객체를 만든 후

CMetaFileDC::Create() 호출– 메타 파일 객체를 일반적인 디바이스 컨텍스트 객체로

간주하고 출력 관련 멤버 함수를 호출– CMetaFileDC::Close() 를 호출하면 윈도우 운영체제가

내부적으로 메타 파일을 만든 후 메타 파일 핸들(HMETAFILE 타입 ) 을 리턴

– CDC::PlayMetaFile() 로 메타 파일을 실행

Page 37: Visual C++ Programming How to draw?

37

그리기 함수 (1/3)

• 점 찍기

SetPixel 과 기능은 동일하지만 SetPixel 함수와 달리 원래의 점의 색을 리턴하지 않으므로 속도가 더 빠르다 .

SetPixelV()

화면의 특정 위치에 원하는 색의 점을 찍으며 원래의 점의 색을 리턴한다 .

SetPixel()

화면의 특정 위치에 해당하는 점의 색을 얻는다 . GetPixel()

기능이름

COLORREF color = dc.GetPixel (x,y);dc.SetPixelV(x,y, RGB(r,g,b));

Page 38: Visual C++ Programming How to draw?

38

COLORREF

• 색을 저장하는 변수• 32 bit DWORD: 0x00rrggbb 형식

• 여러가지 편한 매크로 :COLORREF color = RGB(r,g,b);r = GetRValue (color);g = GetGValue (color);b = GetBValue (color);

Page 39: Visual C++ Programming How to draw?

39

그리기 함수 (2/3)

• 선 그리기

현재 위치로부터 특정 위치까지 선을 그린 후 현재 위치를 갱신한다 .

LineTo()

현재 위치를 옮긴다 .MoveTo()

기능이름

dc.MoveTo(x1,y1);dc.LineTo(x2,y2);

(x1,y1)

(x2,y2)

Page 40: Visual C++ Programming How to draw?

40

그리기 함수 (3/3)

• 도형 그리기

사각형에 내접하는 타원을 그린다 .Ellipse()

사각형을 그린다 . Rectangle()

기능이름

40

dc.Rectangle (x1, y1, x2, y2);dc.Ellipse (x1, y1, x2, y2);

(x1, y1)

(x2, y2)

Page 41: Visual C++ Programming How to draw?

41

텍스트 함수

• 텍스트 출력 함수

기준 위치에 대한 문자열의 정렬 방식을 정한다 .SetTextAlign()

문자의 배경색을 바꾼다 . SetBkColor()

문자의 색을 바꾼다 . SetTextColor()

사각형을 기준으로 문자열을 출력한다 . DrawText()

특정 위치에 문자열을 출력한다 . TextOut()

기능이름

dc.SetTextColor(RGB(255,0,0));dc.SetBkColor(RGB(0,255,0));dc.SetTextAlign(TA_CENTER);dc.TextOut(300,200,“Sejong University”);