55
04 화화 화화 : 학학 학학 학학학학 학학 학학 학학학 학학학학 . CDC 학학학학 학학학 학학 학학 학학학 학학학 . 학학 GDI 학학학 학학학학 학학학학 학학학 학학학 .

윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

  • Upload
    lyris

  • View
    158

  • Download
    6

Embed Size (px)

DESCRIPTION

윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다. GDI 와 디바이스 컨텍스트 (1/5). 출력 시스템을 설계할 때 고려할 사항 모니터 , 비디오 카드 , 프린터 등 출력에 사용되는 주변 장치가 변경되는 경우에도 프로그램을 수정할 필요가 없어야 한다 . - PowerPoint PPT Presentation

Citation preview

Page 1: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

04화면 출력:

학습 목표

윈도우의 화면 출력 원리를 이해한다 .

CDC 클래스를 이용한 화면 출력 기법을 배운다 .

각종 GDI 객체를 생성하고 사용하는 방법을 익힌다 .

Page 2: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

2

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

출력 시스템을 설계할 때 고려할 사항모니터 , 비디오 카드 , 프린터 등 출력에 사용되는 주변

장치가 변경되는 경우에도 프로그램을 수정할 필요가 없어야 한다 .

여러 프로그램이 화면을 분할해서 사용하므로 하나의 프로그램이 출력을 하는데 있어서 제약을 가해야 한다 . 즉 화면이나 기타 출력 장치를 직접 접근 (Direct Access)하거나 독점해서 사용하는 것을 운영체제 차원에서 막아야 한다 .

Page 3: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

3

GDI(Graphic Device Interface)

다수의 창이 하나의 화면을 공유

Page 4: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

4

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

GDI(Graphics Device Interface)운영체제의 하위 시스템 중 하나로서 DLL 로 존재윈도우에서 화면에 점 , 선 , 사각형 , 다각형 , 원 , 비트맵 ,

텍스트 등을 출력하는 모든 것들을 담당함이 일을 담당하는 클래스가 CDC 클래스임

응용 프로그램 GDI출력 장치

( 화면 , 프린터 등 )

장치 독립적 장치 의존적

Page 5: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

5

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

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

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

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

없어야 한다 .

Page 6: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

6

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

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

여러 상황을 고려한 출력 가능– 선 , 문자 , 그림등을 화면으로 입력 또는 출력함– 프린터에 출력함

Page 7: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

7

무효 영역 (1/3)

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

Page 8: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

8

무효 영역 (2/3)

WM_PAINT 에서 무효영역 처리함 WM_PAINT 메시지 처리

HelloSDK

HelloMFC

case WM_PAINT: hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, str, lstrlen(str)); EndPaint(hwnd, &ps); return 0;

void CMainFrame::OnPaint(){ char *msg = "Hello, MFC"; CPaintDC dc(this); dc.TextOut(100, 100, msg, lstrlen(msg));}

Page 9: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

9

무효 영역 (3/3)

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

무효 영역 생성void CWnd::Invalidate (BOOL bErase = TRUE);void CWnd::InvalidateRect (LPCRECT lpRect, BOOL bErase = TRUE);

Page 10: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

10

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

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

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

CWindowDC

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

CClientDC

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

CPaintDC

용도 클래스 이름

Page 11: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

11

CPaintDC 클래스

클래스 계층도

CPaintDC 사용 예

void CChildView::OnPaint() {

CPaintDC dc(this); // ...}

Page 12: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

12

CClientDC 클래스

CClientDC 사용 예

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

CClientDC dc(this);// ...

}

Page 13: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

13

CWindowDC 클래스

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

원점 위치

(0, 0) CWindowDC

(0, 0) CPaintDC, CClientDC

Page 14: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

14

CMetaFileDC 클래스

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

CMetaFileDC 사용 방법CMetaFileDC 객체를 만든 후 CMetaFileDC::Create()

호출메타 파일 객체를 일반적인 디바이스 컨텍스트 객체로

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

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

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

Page 15: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

15

그리기 함수 (1/3)

점 찍기

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

SetPixelV()

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

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

SetPixel(xSetPixel(x 좌표값좌표값 , y, y 좌표값좌표값 , RGB, RGB 값값 ) : ) : 화면의 특정위치에 화면의 특정위치에 원하는 색의 점을 찍으며원하는 색의 점을 찍으며 , , 원래 점의색을 리턴함원래 점의색을 리턴함

Page 16: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

16

CDC 클래스의 그래픽 관련 함수들

도형그리기RectangleEllipseArc

문자출력함수TextOutDrawText

Page 17: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

17

그리기 함수 (1/3)

선 그리기

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

LineTo()

현재 위치를 옮긴다 .MoveTo()기능이름

-MoveTo(x 위치값 , y 위치값 ) : x,y 위치로 현재위치를 옮긴다 .-LineTo(x 위치값 , y 위치값 ) : 항상 클라이언트 영역의 0,0 위치를 기준으로 한다 . 기준위치를 옮기려면 MoveTo 이용해야 한다 .

Page 18: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

18

그리기 함수 (2/3)

선그리기 ( 예를 들어서 (x1, y1) –(x2,y2) 를 잇는 선을 그린다고

과정한다 )1. 현재 위치를 (x1, y1) 으로 옮긴다 . MoveTo() 함수 이용 dc.MoveTo(x1, y1); 2. 현재 위치에서 (x2, y2) 까지 선을 그린다 . LineTo() 함수 이용 dc.LineTo(x2, y2);예 ) (10,10) 에서 (200,200) 을 잇는 선을 그린다 . CPaintDC dc(this); dc. MoveTo(10,10); dc.LineTo(200,200);

Page 19: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

19

그리기 함수 (3/3)

도형 그리기

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

사각형을 그린다 . Rectangle()

기능이름

- Rectangle(x, y, width, height) : 왼쪽 상단의 x,y 지점에서 폭 이 width, 높이가 height 인 사각형 그림 -Ellipse(x, y, width, height) : 사각형을 그린 후 , 그 안에 원을 그리는 형태로 타원을 그림 .

Page 20: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

20

텍스트 함수

텍스트 출력 함수

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

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

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

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

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

Page 21: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

21

텍스트 함수

TextOut 함수 지정된 위치에 문자열을 출력하는 함수임 함수원형

– BOOL TextOut (x 좌표값 , y 좌표값 , 문자열 , 문자열길이 ); 예제 CClientDC dc(this); dc.TextOut(10,10, “ 안녕하세요” ); 10, 10 위치에 “안녕하세요” 문자열 출력

Page 22: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

22

텍스트 함수

DrawText 함수 지정된 사각형안에 문자열을 출력하는 함수임 함수원형

– int DrawText ( 문자열 ,LPRECT lprect, UINT nFormat); lprect : 출력할 사각 영역 nFormat : 출력 형식 플러그

예제 CClientDC dc(this); CRect rect; GetClientRect(&rect); dc.DrawText(“ 사각형에출력” , &rect,DT_CENTER); 지정된 사각형안에 문자열 출력

Page 23: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

23

텍스트 함수

값 내 용

DT_TOP DT_BOTTOM DT_LEFT DT_RIGHT

설정된 lpRect 영역에 상단 (DT_TOP), 하단 (DT_BOTTOM), 좌측 (DT_LEFT), 우측으로 (DT_RIGHT) 문자를 출력 한다 .

DT_SINGLELINE 가 함께 지정되어 있어야 한다 .

DT_CENTER 설정된 영역의 가로중앙에 정렬시킨다

DT_VCENTER 설정된 영역의 세로 중앙에 정렬 시킨다 .DT_SINGLELINE 가 함께 지정되어 있어야 한다 .

DT_EXPANDTABS 문자열에 탭이 포함되어 있을 때 공백으로 띄어 준다 . 기본폭은 8 이다 .

DT_CALCRECT  텍스트가 출력할 사각형의 영역을 계산한다 . 이때 문자는 출력되지 않는다 .

DT_EXTERNALLEADING 문자의 높이를 계산할 때 external leading sapce 를 호함시킨다 .

DT_SINGLELINE 행바꿈과 라인 피드를 무시하고 한줄로 출력한다 .

DT_NOCLIP 클리핑 없이 문자를 출력한다 .

DT_NOPREFIX& 문자를 표식어로 상용하지 않는다 . 일반적으로 & 코드는 출력하지 않고 다음 문자에 밑줄을

그린다 .

DT_TABSTOP Flat 상위 8비트에 값을 넣어서 탭간격을 변화시킨다 .

DT_WORDBREAK 문자열이 영역밖으로 출력되면 개행하여 출력한다

Page 24: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

24

텍스트 함수 SetTextColor 함수

배경색은 그대로 두고 텍스트의 전경색을 설정함 함수원형

COLORREF SetTextColor(COLORREF crColor ); 예제 CClientDC dc(this); dc.SetTextColor(RGB(100,200,300)); //초록색 지정 dc.TextOut(10,10, “ 안녕하세요” );

SetBkColor 함수 텍스트의 배경색을 설정함 함수원형

COLORREF SetBkColor(COLORREF crColor ); 예제

CClientDC dc(this); dc.SetBkColor(RGB(255,255,0)); //노란색 지정

Page 25: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

25

텍스트 함수

SetTextAlign 함수 기준위치에 대한 텍스트의 정렬방법을 설정함 함수원형

UINT SetTextAlign(UINT fMode);– fMode // 텍스트 정렬 모드

TA_TOP : 지정한 좌표가 상단 좌표가 된다 . TA_BOTTOM : 지정한 좌표가 하단 좌표가 된다 . TA_CENTER : 지정한 좌표가 수평 중앙 좌표가 된다 . TA_LEFT : 지정한 좌표가 수평 왼쪽 좌표가 된다 .( 기본 ) TA_RIGHT : 지정한 좌표가 수평 오른쪽 좌표가 된다 . TA_UPDATECP : 지정한 좌표대신 CP 를 사용하며 문자열 출력 후에 CP 를 변경한다 .

TA_NOUPDATECP : CP 를 사용하지 않고 지정한 좌표를 사용하며 CP 를 변경하지 않는다 .

Page 26: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

26

텍스트 함수

SetTextAlign 함수 예제 dc.TextOut(70,0,"Hello World!");

dc.SetTextAlign(TA_CENTER); dc.TextOut(70,20,"Hello World!"); 70,20 이 중심점 dc.SetTextAlign(TA_RIGHT); dc.TextOut(70,40,"Hello World!");

Page 27: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

27

GDI 객체 (1/3)

GDI 객체GDI 에서 출력할 때 사용하는 도구

종류

GDI 객체

용도 클래스 이름

펜 선을 그릴 때 CPen

브러시 면의 내부를 채울 때 CBrush

폰트 문자를 출력할 때 CFont

비트맵 픽셀의 집합으로 이루어진 그림을 다룰 때 CBitmap

팔레트 출력될 색의 집합을 다룰 때 CPalette

영역 다양한 형태의 면을 정의할 때 CRgn

Page 28: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

28

GDI 객체 (2/3)

클래스 계층도

폐다각형의 내부담당

그림의 선 부분 담당

DC 객체가 그래픽처리시 사용하는 자원들

브러시 객체

연필 객체

Page 29: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

29

GDI 를 통한 출력 절차

등록

DC 객체생성

DC 객체소멸사용 후… .

Brush 생성

Brush 소멸

4 5

2

3

1

Page 30: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

30

GDI 객체 (3/3)

GDI 객체 사용 방법GDI 객체를 스택에 생성한다 .생성된 GDI 객체를 디바이스 컨텍스트에 선택하고

이전에 선택되어 있던 같은 종류의 GDI 객체의 주소를 저장해둔다 (CDC::SelectObject() 사용 ).

GDI 함수를 사용하여 출력을 한다 .이전의 GDI 객체를 디바이스 컨텍스트에 선택함으로써

기존에 선택된 GDI 객체를 선택 해제한다 (CDC::SelectObject() 사용 ).

GDI 객체가 범위 (Scope) 를 벗어나면 소멸자가 자동으로 호출되면서 파괴된다 .

Page 31: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

31

펜 (1/2)

생성 방법

펜 스타일

// 방법 1CPen pen(PS_SOLID, 2, RGB(255, 0, 0));

// 방법 2CPen pen;pen.CreatePen (PS_SOLID, 2, RGB (255, 0, 0));

Page 32: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

32

펜 (2/2)

사용 예 1

사용 예 2

CPaintDC dc(this);CPen pen(PS_SOLID, 1, RGB(0, 0, 255));CPen *pOldPen = dc.SelectObject(&pen);dc.Rectangle(100, 100, 200, 200);dc.SelectObject(pOldPen);

CPaintDC dc(this);CPen pen(PS_SOLID, 1, RGB(0, 0, 255));dc.SelectObject(&pen);dc.Rectangle(100, 100, 200, 200);

//펜객체 생성// 생성한 펜을 객체로 선택함

// 도형을 그림

//펜객체 생성// 이전 객체의 상태를 저장하면서새로 생성된 펜 객체 선택함 .

// 도형그림// 이전 객체를 선택함

Page 33: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

33

브러시 (1/2)

도형의 내부를 지정한 색상 및 무늬로 채운다 . 종류

브러시 종류 생성 예

솔리드 (Solid, 속이 채워짐 )

CBrush brush(RGB(255, 0, 0));

해치 (Hatch, 교차된 평행선 무늬 )

CBrush brush(HS_DIAGCROSS, RGB(255, 0, 0));

패턴 (Pattern, 비트맵의 반복 무늬 )

CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush(&bitmap);

Page 34: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

34

브러시 (1/2)

해치브러시 스타일 CBrush brush(HS_DIAGCROSS, RGB(255, 0, 0));

Page 35: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

35

브러시 (2/2)

사용 예 1

사용 예 2

CPaintDC dc(this); CBrush brush(RGB(255, 0, 0));CBrush *pOldBrush = dc.SelectObject(&brush);dc.Ellipse(100, 100, 200, 200);dc.SelectObject(pOldBrush);

CPaintDC dc(this); CBrush brush(RGB(255, 0, 0));dc.SelectObject(&brush);dc.Ellipse(100, 100, 200, 200);

//DC 객체 생성//DC 객체 생성

// 브러시객체 생성

// 생성한 객체 등록// 도형그림

//DC 객체 생성

// 객체 등록 +// 이전 객체 저장

// 도형 그림

// 이전 객체 등록

Page 36: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

36

브러시

LOGBRUSH 구조체 원형

typedef struct tagLOGBRUSH { UINT lbStyle; //브러시 스타일 정의 COLORREF lbColor; // 색상 정의 LONG lbHatch; // 무늬 정의 } LOGBRUSH;

Page 37: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

37

브러시

LOGBRUSH 구조체 사용예제CClientDC dc(this); //DC 객체 생성 LOGBRUSH logbrush; // LOGBRUSH 구조체 변수 선언 //브러시의 내용을 정의 logbrush.lbColor = RGB(255,0,255); // 색상 설정 logbrush.lbStyle = BS_HATCHED; // 무늬가 있는 붓 설정 logbrush.lbHatch = HS_CROSS; //십자가 무늬 설정

CBrush objectBrush; //브러시 객체 생성 objectBrush.CreateBrushIndirect(&logbrush); //브러시의 내용을 LOGBRUSH 통해서 간접 참조 dc.SelectObject(&br); //브러시 객체 등록 dc.Ellipse(point.x, point.y, point.x+50,point.y+50);

Page 38: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

38

브러시

CBrush:: CreateBrushIndirect 함수 설명

BOOL CBrush:: CreateBrushIndirect ( const LOGBRUSH* lpLogBrush );

- LOGBRUSH 구조체에 설정되어 있는 브러시의 내용을선택하는 함수임 -예CBrush objectBrush; //브러시 객체 생성 objectBrush.CreateBrushIndirect(&logbrush); //브러시의 내용을 LOGBRUSH 통해서 간접 참조

Page 39: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

39

브러시 – 비트맵으로 면 채우기

CBitmap bitmap; //CBitmap 클래스의 객체 선언

bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1 그림을 메모리에 로드 CBrush br(&bitmap); // 면을 그림으로 채워라

dc.SelectObject(&br); // 생성한 브러시객체 등록

dc.Ellipse(point.x, point.y, point.x+50,point.y+50);

Page 40: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

40

폰트

생성 방법CFont 객체 생성CFont 객체에 대해 Create*() 함수를 호출

CFont font;font.CreateFont(...);// font.CreateFontIndirect(...);// font.CreatePointFont(...);// font.CreatePointFontIndirect(...);

Page 41: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

41

폰트

LOGFONT 구조체typedef struct tagLOGFONT { // lf

LONG lfHeight; // 높이 LONG lfWidth; // 폭 LONG lfEscapement; // 기울기 10 도를 기울이게 하려면 100 을 넣는다 . LONG lfOrientation; // 한문자당 기울기 LONG lfWeight; // 굵기 ( 일반 : 400 FW_NORMAL, BOLD : 700 FW_BOLD 정도 )

BYTE lfItalic; // Italic BYTE lfUnderline; // 밑줄 (TRUE) BYTE lfStrikeOut; // 취소선 (TRUE) BYTE lfCharSet; // 문자셋 ( 영문만 , 0, 한글도 하려면 1 ) BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; // 글꼴} LOGFONT;

Page 42: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

42

폰트

CreateFontIndirect :LOGFONT 구조체에 지정된 특성으로 CFont 객체를 초기화한다 .

CreateFont : 주어진 속성을 이용하여 CFont 객체를 초기화한다 .

CreatePointFont : 포인트의 1/10 의 크기를 단위로 하여 , 지정된 높이를 갖는 CFont 객체를 초기화한다 .

CreatePointFontIndirect : 논리 단위가 아닌 포인트의 1/10 의 크기를 단위로 했다는 점만 빼고 CreateFontIndirect 함수와 거의 동일하다 .

Page 43: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

43

폰트

사용 예

CPaintDC dc(this);CFont font;font.CreatePointFont(400, "Arial");dc.SelectObject(&font);dc.TextOut(10, 10, CString("Hello"));

Page 44: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

44

내장 객체

CDC::SelectStockObject() 함수를 사용하여 디바이스 컨텍스트에 선택한다 .

이름 용도BLACK_PEN 폭이 1 픽셀인 검정색 펜WHITE_PEN 폭이 1 픽셀인 흰색 펜NULL_PEN 투명 펜BLACK_BRUSH 검정색 브러시DKGRAY_BRUSH 어두운 회색 브러시GRAY_BRUSH 회색 브러시LTGRAY_BRUSH 밝은 회색 브러시HOLLOW_BRUSH 또는 NULL_BRUSH

투명 브러시SYSTEM_FONT 윈도우 운영체제가 사용하는 폰트

예 ) 메뉴 , 대화상자 , ...

Page 45: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

45

비트맵 (1/5)

비트맵 정보

typedef struct tagBITMAP { int bmType; int bmWidth; // 비트맵의 폭 (픽셀 단위 ) int bmHeight; // 비트맵의 높이 (픽셀 단위 ) int bmWidthBytes; BYTE bmPlanes; BYTE bmBitsPixel; LPVOID bmBits;} BITMAP;

구조체를 통해서 비트맵의 정보를 가져온다 .

비트맵의 정보가 담긴구조체

int CBitmap::GetBitmap (BITMAP* pBitMap) ;

Page 46: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

46

비트맵 (2/5)

비트맵 정보 출력

CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bmpinfo;bitmap.GetBitmap(&bmpinfo)CString str;Str.Format(" 가로 = %d, 세로 = %d\n", bmpinfo.bmWidth, bmpinfo.bmHeight);dc.TextOut(10,10,str);

Page 47: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

47

비트맵 (3/5)

비트맵 출력에 사용되는 함수 CDC::CreateCompatibleDC()

– 메모리 디바이스 컨텍스트를 만든다 .– 그래픽 출력에 이용할 메모리 생성 . 정확하게는 DC

장치와 같은 기능을 하는 메모리 DC 를 생성 하는 것임– 함수 원형 BOOL CreateCompatibleDC( CDC* pDC );

Page 48: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

48

비트맵 (4/5)

비트맵 출력에 사용되는 함수 CDC::BitBlt()

– 비트맵을 원본의 크기와 같은 크기로 화면에 출력한다 .

CDC::StretchBlt() – 비트맵을 원본의 크기와 다른 크기로 화면에

출력할때 사용한다 .

Page 49: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

49

비트맵 (4/5)

비트맵 출력 함수

BOOL BitBlt (int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop) ;

( 스크린 디바이스 컨텍스트 )

pSrcDC( 메모리 디바이스 컨텍스트 )

x

ynWidth

nHeight

xSrc

ySrc

Page 50: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

50

비트맵 (5/5)

비트맵 출력 함수 (cont'd)

BOOL StretchBlt (int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop) ;

( 스크린 디바이스 컨텍스트 )

pSrcDC( 메모리 디바이스 컨텍스트 )

x

ynWidth

nHeight

xSrc

ySrcnSrcWidth

nSrcHeight

크기변경 출력가능함

Page 51: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

51

매핑 모드

+x

매핑 모드 단위 x축 y축

MM_TEXT 1 픽셀 +x +y

MM_LOMETRIC 0.1 mm -y

MM_HIMETRIC 0.01 mm +x -y

MM_LOENGLISH 0.01 인치 +x -y

MM_HIENGLISH 0.001 인치 +x -y

MM_TWIPS 1/1440 인치 +x -y

MM_ISOTROPIC 사용자 정의 (가로 , 세로 길이 동일 )

사용자 정의 사용자 정의

MM_ANISOTROPIC

사용자 정의 사용자 정의 사용자 정의

Page 52: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

52

좌표 변환 (1/2)

스크린 좌표와 클라이언트 좌표

스크린 좌표의 원점 클라이언트 좌표의 원점

Page 53: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

53

좌표 변환 (2/2)

좌표 변환 함수

장치 좌표

클라이언트 좌표

스크린 좌표

논리 좌표

ScreenToClient ClientToScreen

DPtoLP

LPtoDP

Page 54: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

54

속성 함수

속성 초기값텍스트 색상 검정색

배경 색상 흰색배경 모드 OPAQUE

매핑 모드 MM_TEXT

그리기 모드 R2_COPYPEN

현재 위치 (0, 0)

펜 BLACK_PEN

브러시 WHITE_BRUSH폰트 SYSTEM_FONT비트맵 없음

팔레트 없음영역 없음

속성을 얻는 함수GetTextColor()

GetBkColor()GetBkMode()GetMapMode()GetROP2()

GetCurrentPosition()SelectObject()SelectObject()SelectObject()SelectObject()SelectPalette()SelectObject()

속성을 변경하는 함수SetTextColor()

SetBkColor()SetBkMode()SetMapMode()SetROP2()

MoveTo()SelectObject()SelectObject()SelectObject()SelectObject()SelectPalette()SelectObject()

Page 55: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

55

그리기 모드

그리기 모드 연산R2_NOP D = D R2_NOT D = ~D

R2_BLACK D = BLACK R2_WHITE D = WHITE

R2_COPYPEN D = S R2_NOTCOPYPEN D = ~S

R2_MERGEPENNOT D = ~D | S R2_MASKPENNOT D = ~D & S

R2_MERGENOTPEN D = ~S | D R2_MASKNOTPEN D = ~S & D

R2_MERGEPEN D = D | S R2_NOTMERGEPEN D = ~(D | S)

R2_MASKPEN D = D & S R2_NOTMASKPEN D = ~(D & S)

R2_XORPEN D = S ^ D R2_NOTXORPEN D = ~(S ^ D)

그리기 모드 연산