윈도우의 화면 출력 원리를 이해한다 . cdc 클래스를 이용한 화면 출력...

39
04 화화 화화 : 학학 학학 학학학학 학학 학학 학학학 학학학학 . CDC 학학학학 학학학 학학 학학 학학학 학학학 . 학학 GDI 학학학 학학학학 학학학학 학학학 학학학 .

Upload: tracy

Post on 24-Jan-2016

196 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

04화면 출력:

학습 목표

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

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

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

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

2

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

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

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

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

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

3

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

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

출력을 담당

응용 프로그램 GDI출력 장치

( 화면 , 프린터 등 )

장치 독립적 장치 의존적

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

4

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

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

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

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

할 수 없어야 한다 .

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

5

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

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

여러 상황을 고려한 출력 가능 윈도우 응용 프로그램의 출력 과정

출력하기 전에 윈도우 운영체제에게 디바이스 컨텍스트를 요청한다 .

운영체제의 GDI 는 내부적으로 디바이스 컨텍스트를 만든 후 디바이스 컨텍스트 핸들 (HDC 타입 , 32 비트 포인터 ) 을 해당 프로그램에게 돌려준다 .

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

6

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

윈도우 응용 프로그램의 출력 과정 (cont'd)응용 프로그램은 자신이 받은 핸들을 , 출력 관련 API

함수를 호출할 때 사용한다 . 출력 관련 API 함수를 호출하면 GDI 가 이를 처리한다 .

GDI 는 해당 프로그램이 넘겨준 디바이스 컨텍스트 핸들로 내부 데이터를 참조하여 다양한 상황을 고려해서 출력한다 .

응용 프로그램

디바이스컨텍스트 GDI

장치드라이버

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

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

7

무효 영역 (1/3)

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

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

8

무효 영역 (2/3)

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

출력 방법 비교

SDK윈도우 운영체제에게 디바이스 컨텍스트를 요청한다 .운영체제로부터 받은 디바이스 컨텍스트 핸들을

사용하여 출력을 한다 .운영체제에게 디바이스 컨텍스트 사용이 끝났음을

알린다 . MFC

디바이스 컨텍스트 객체를 생성한다 .객체의 멤버 함수를 호출하여 출력한다 .

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

11

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

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

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

CWindowDC

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

CClientDC

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

CPaintDC

용도 클래스 이름

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

12

CPaintDC 클래스

클래스 계층도

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

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

13

CClientDC 클래스

CClientDC 사용 예void CChildView::OnLButtonDown(UINT nFlags, CPoint point) {

CClientDC dc(this);// ...

}

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

14

CWindowDC 클래스

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

원점 위치(0, 0) CWindowDC

(0, 0) CPaintDC, CClientDC

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

15

CMetaFileDC 클래스

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

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

호출메타 파일 객체를 일반적인 디바이스 컨텍스트 객체로 간주하고 출력 관련 멤버 함수를 호출

CMetaFileDC::Close() 를 호출하면 윈도우 운영체제가 내부적으로 메타 파일을 만든 후 메타 파일 핸들 (HMETAFILE 타입 ) 을 리턴

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

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

16

그리기 함수 (1/3)

점 찍기

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

SetPixelV()

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

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

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

17

그리기 함수 (2/3)

선 그리기

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

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

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

18

그리기 함수 (3/3)

도형 그리기

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

사각형을 그린다 . Rectangle()

기능이름

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

19

텍스트 함수

텍스트 출력 함수

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

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

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

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

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

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

20

매핑 모드

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

21

좌표 변환 (1/2)

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

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

22

좌표 변환 (2/2)

좌표 변환 함수

장치 좌표

클라이언트 좌표

스크린 좌표

논리 좌표

ScreenToClient ClientToScreen

DPtoLP

LPtoDP

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

23

속성 함수

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

배경 색상 흰색배경 모드 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 24: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

24

그리기 모드

그리기 모드 연산

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)

그리기 모드 연산

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

25

GDI 객체 (1/3)

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

종류GDI 객체

용도 클래스 이름

펜 선을 그릴 때 CPen

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

폰트 문자를 출력할 때 CFont

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

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

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

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

26

GDI 객체 (2/3)

클래스 계층도

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

27

GDI 객체 (3/3)

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

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

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

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

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

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

28

펜 (1/2)

생성 방법

펜 스타일

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

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

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

29

펜 (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 30: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

30

브러시 (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 31: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

31

브러시 (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);

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

32

폰트 (1/2)

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

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

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

33

폰트 (2/2)

사용 예

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

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

34

내장 객체

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

35

비트맵 (1/5)

비트맵 정보

int CBitmap::GetBitmap (BITMAP* pBitMap) ;

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

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

36

비트맵 (2/5)

비트맵 정보 출력

CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bmpinfo;bitmap.GetBitmap(&bmpinfo);TRACE(" 가로 = %d, 세로 = %d\n", bmpinfo.bmWidth, bmpinfo.bmHeight);

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

37

비트맵 (3/5)

비트맵 출력 절차CDC::CreateCompatibleDC() 함수를 이용하여 메모리

디바이스 컨텍스트를 만든다 .CDC::SelectObject() 함수를 이용하여 비트맵을 메모리

디바이스 컨텍스트에 선택한다 .CDC::BitBlt() 또는 CDC::StretchBlt() 함수를 이용하여

화면에 출력한다 .

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

38

비트맵 (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 39: 윈도우의 화면 출력 원리를 이해한다 . CDC 클래스를 이용한 화면 출력 기법을 배운다 . 각종 GDI 객체를 생성하고 사용하는 방법을 익힌다

39

비트맵 (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