windows programming 제대로 배우기

37
Windows Programming 제제제 제제제 Chapter 5. Basic Drawing

Upload: gareth

Post on 04-Jan-2016

93 views

Category:

Documents


0 download

DESCRIPTION

Windows Programming 제대로 배우기. Chapter 5. Basic Drawing. 학습 목표. 목표 화면에 글자 및 선 , 박스 , 원 , 다각형을 출력하는 방법에 대해서 설명 학습 단계 윈도우 GUI 환경의 기본 개념을 이해 텍스트를 출력하는 여러 방법 학습 DC(Device Context) 를 얻는 방법 학습 선 , 박스 , 원 , 다각형을 출력하는 방법 학습. GDI(Graphics Device Interface) 의 개념. hwnd=CreateWindow( … .); - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Windows Programming 제대로 배우기

Windows Programming제대로 배우기

Chapter 5. Basic Drawing

Page 2: Windows Programming 제대로 배우기

2

학습 목표목표

화면에 글자 및 선 ,박스 ,원 , 다각형을 출력하는 방법에 대해서 설명

학습 단계1.윈도우 GUI환경의 기본 개념을 이해2.텍스트를 출력하는 여러 방법 학습3.DC(Device Context)를 얻는 방법 학습4.선 ,박스 ,원 ,다각형을 출력하는 방법 학습

Page 3: Windows Programming 제대로 배우기

3

GDI(Graphics Device Interface) 의 개념

hwnd=CreateWindow(….); TextOut(hwnd, 글자를 출력하는 옵션 );

HWND 는 하나의 윈도우의 여러 정보를 가지는 구조체HDC는 HWND 와 연결되어있는 화면을 위한 구조

윈도우에서 GDI - GDI란 Graphics Device Interface 의 약자- 윈도우는 단지 그 디바이스드라이버를 로드하여 화면 출력은

디바이스드라이버에 의존- 윈도우 시스템은 현재 화면의 전체 크기는 어떻게 출력되는가와 현재

화면에 출력되는 칼라수가 어떤 것이라는 정보를 디바이스 드라이버를 통해서 얻고 또한 디바이스 드라이버에 설정해 주는 역할

- 윈도우 시스템은 디바이스 드라이버와 서로 인터페이스

Page 4: Windows Programming 제대로 배우기

4

GDC (Graphics Device Context)

GDC(Graphic Device Context)- 각 윈도우의 화면과 모니터 화면과는 별개- 각 윈도우 화면이 모니터에 다 나타나지 않을 수도 있다- 각 윈도우마다 해당되는 화면이 따로 존재하고 이것은

화면에 나타나지 않아도 어느 메모리를 점유하며 존재한다는 것을 의미

- 각 윈도우는 각 윈도우에 해당하는 메모리가 있고 이것을 윈도우 시스템에서는 조화있게 화면에 출력하는 기능

- 프로그램을 작성할 경우에는 단순히 현재 윈도우와 연결되어 있는 HDC 를 이용하여 글자를 기록하고 도형을 기록하지만 그것은 모니터 화면에 기록하는 것이 아니라 윈도우와 연결되어 있는 화면 메모리에 기록을 하는 것임

Page 5: Windows Programming 제대로 배우기

5

GDC (Graphics Device Context)

그림 그리는 단계- 윈도우가 만들어지면 시스템에서는 그 윈도우의 화면 메모리 영역을 할당- 그 화면에 메모리영역에서 모니터에 출력할 부분을 읽어다가 해당위치에 출력- 이런 컨트롤을 하는 프로그램이 윈도우 시스템에 있는 "GDI32.DLL“ => 그래픽

디바이스 인터페이스를 모두 관장하는 프로그램

디바이스 컨텍스트- 윈도우와 연결되어 있는 화면은 모니터 화면이 아니라는 것 , 즉 , 윈도우

시스템에서 설정한 화면 메모리라는 것이고 이 메모리를 컨트롤 하는 것이 바로 HDC라는 핸들

- 그래픽을 출력하고자 할 경우에는 HDC핸들을 얻어야 함

HDC- 디바이스 컨텍스 핸들- 디바이스 컨텍스트라는 것은 바로 현재 윈도우와 연결된 화면 메모리 관리자

Page 6: Windows Programming 제대로 배우기

6

HDC핸들 얻기 첫 번째 방법* WM_PAINT

hdc = BeginPaint (hwnd, &ps) ;

EndPaint (hwnd, &ps) ;

WM_PAINT 라는 메시지• 화면을 제출력할 필요가 있을 때 사용되는 메시지• 이메시지와 함게 Beginpaint함수와 EndPaint함수는 쌍으로 호출되는 것이

기본• 화면을 재출력하고자 할 경우 먼저 HDC를 받음• BeginPaint함수의 첫 번째 인자는 윈도우 핸들러 HWND

– 윈도우와 연계된 화면 출력 메모리 핸들러를 받아야 하기 때문에 필수적으로 넘겨주어야 함

• ps는 PAINTSTRUCT 구조체– 윈도우의 실제 출력하는 화면 메모리의 영역에 대한 정보를 가지고 있음

Page 7: Windows Programming 제대로 배우기

7

HDC핸들 얻기 첫 번째 방법PAINTSTRUCT 구조체

Page 8: Windows Programming 제대로 배우기

8

HDC핸들 얻기 첫 번째 방법EndPaint (hwnd, &ps)

HDC 를 얻은 후에 이 HDC 에 여러 그래픽 내용을 출력하면 화면에 출력 . 이렇게 출력을 한 다음에 출력종료를 의미하는 함수

InvalidateRgn

WM_PAINT 메세지는 외부에서도 호출할 수 있지만 내부에서도 호출가능 => 이것을 호출하는 방법은 이 함수 사용

BOOL InvalidateRgn( HWND hWnd, // 윈도우 핸들 HRGN hRgn, // 새로 출력할 화면 영역 BOOL bErase // 배경색을 다시칠하는 유무 플러그

); HRGN

이 형은 바로 다시 출력할 화면의 영역을 정보를 가지고 있는 영역 핸들러

Page 9: Windows Programming 제대로 배우기

9

HDC핸들 얻기 첫 번째 방법InvalidateRgn

WM_PAINT라는 메시지가 수행되고 그 안에 있는 내용들이 출력됨

WM_PAINT: 출력 데이터 변수를 화면에 출력 : break;

다른 메시지 처리 루틴 : 출력 데이터 변경 break;

Page 10: Windows Programming 제대로 배우기

10

HDC핸들 얻기 첫 번째 방법( 예 )

char name[80]; char tel[80] WM_PAINT:

hdc = BeginPaint (hwnd, &ps) ; TextOut(0,0,name,strlen(name)); TextOut(0,10,name,strlen(tel)); EndPaint (hwnd, &ps) ; break;

다른 메시지 strcpy(name," 이상엽 "); strcpy(tel," 이구팔 - 마구돌려 "); InvalidateRgn(hwnd,NULL,TRUE); break;

Page 11: Windows Programming 제대로 배우기

11

HDC핸들 얻기 두 번째 방법- 윈도우에서도 필요할 때마다 HDC핸들러를 얻어서 화면 출력할 수가 있음

- 이 방법의 기본 형태

hdc=GetDC(hwnd);

ReleaseDC(hwnd,hdc);

(1) GetDC 를 하게 되면 출력 디바이스 핸들러가 넘어오게 되고 이 DC 를 이용하여 그래픽을 출력

(2) GetDC 를 이용하면 일시적인 출력(3) 만일 화면에 감추어져 있다가 나타나거나 프로그램 내에서 InvalidateRgn 이라는

함수를 호출하게 되면 WM_PAINT 가 호출되고 그리고 새로 화면을 출력하기 때문에 GetDC 와 ReleaseDC 를 이용하여 출력한 내용은 사라지게 됨

(4) 보통 GetDC 와 ReleaseDC 를 이용할때는 잠시 출력하는 데이터나 또는 DC 의 정보를 얻기 위한 수단으로 많이 이용

Page 12: Windows Programming 제대로 배우기

12

HDC핸들 얻기 두 번째 방법(예) 화면의 가로 픽셀과 세로 픽셀의 수 픽셀당 비트수 칼라수등을 얻고자 할 경우

이때도 DC를 이용한 GetDeviceCaps라는 함수를 사용

int GetDeviceCaps( HDC hdc, //디바이스 컨텍스트 핸들 int nIndex //얻고자 하는 정보 번호

);

hdc=GetDC(hwnd);

Dvnum=GetDeviceCaps(hdc,HORZRES );// 전체화면 가로픽셀 Dvnum=GetDeviceCaps(hdc,VERTRES );// 전체화면 세로 픽셀 Dvnum=GetDeviceCaps(hdc,BITSPIXEL );// 픽셀당 비트수 Dvnum=GetDeviceCaps(hdc,NUMCOLORS );// 사용하는 칼라수

ReleaseDC(hwnd,hdc);

Page 13: Windows Programming 제대로 배우기

13

HDC핸들 얻기 세 번째 방법1. 윈도우 핸들과함께 해당되는 DC 를 얻었음

2. 필요에 따라서 DC 만 따로 만들 필요가 있음(1) 화면에 출력을 하지 않고 우선은 DC 를 만들고 그안에 여러 정보를 출력한 다음 이것을 화면에 전송할 경우(2) bmp 파일을 읽어서 적당하게 처리한 다음 그것을 DC 로 가지고 있다고 화면에 붙일 수도 있기 때문

=> 윈도우와 연결되어 있지 않는 독립적인 DC 를 얻는 함수는 CreateDC

Page 14: Windows Programming 제대로 배우기

14

HDC핸들 얻기 세 번째 방법HDC CreateDC(

LPCTSTR lpszDriver, // 선택할 특정 드라이버 이름 LPCTSTR lpszDevice, // 선택할 특정 디바이스 이름 LPCTSTR lpszOutput, // 사용안함 NUL을 사용 CONST DEVMODE *lpInitData // 프린터 출력시 사용합니다.

);

(예 )hdc=CreateDC("DISPLAY",NULL,NULL,NULL); wsprintf(temp," 윈도우 전체 화면 DC 를 얻어서 출력 "); TextOut(hdc,0,0,temp,strlen(temp)); DeleteDC(hdc);

CreateDC 의 드라이버 이름을 "DISPLAY" 라는 명을 사용하게 되면 전체 화면 DC 를 얻게 됨 .

=> 이 DC 를 이용하여 여러 내용을 출력함

Page 15: Windows Programming 제대로 배우기

15

윈도우의 특정 HDC 얻기클라이언트 영역의 DC

WM_PAINT 의 메시지후에 BeginPaint 함수에 의해서 얻어진 DC

비클라이언트 영역을 포함한 전체 DC 를 받고자 할 경우윈도우는 실제 데이터를 출력하는 영역과 이 영역을 감싸고 있는

타이틀 바와 축소확대 버튼 종료 버튼 그리고 윈도우 경계선들이 있음

WM_PAINT 에서 얻어진 DC 는 타이틀 바와 경계선을 제외결국 타이틀 바와 경계부분의 영역의 DC 는 WM_PAINT 로는 받을

수가 없음

=> GetWindowDC

Page 16: Windows Programming 제대로 배우기

16

윈도우의 특정 HDC 얻기

hdc=GetWindowDC(hwnd); : ReleaseDC(hwnd,hdc);

- GetWindowDC 를 호출하게 되면 윈도우 외곽선을 포함한 모든 영역 즉 윈도우 전체 영역을 DC 로 받을 수 있음

- 보통 외곽이 없는 프로그램을 작성하고자 할 경우 또는 특정형태의 윈도우 ( 보통 타이틀 윈도우 ) 일 경우에 이 DC 를 간혹 이용하기도 함

Page 17: Windows Programming 제대로 배우기

17

텍스트 출력하기

기본적인 텍스트 출력 기본적인 텍스트 출력 TextOutTextOut

BOOL TextOut( HDC hdc, // 디바이스 컨텍스 핸들 int nXStart, // 문자 출력 시작점 x 좌표 int nYStart, // 문자 출력 시작점 y 좌표 LPCTSTR lpString, // 문자열 int cbString // 문자열의 길이 );

Page 18: Windows Programming 제대로 배우기

18

텍스트 출력하기

박스 영역에 출력 함수 박스 영역에 출력 함수 DrawText DrawText

int DrawText( HDC hdc, // 디바이스 컨텍스트 핸들 LPCSTR lpString,// 출력할 문자 int nLength, // 출력할 문자의 수 LPRECT lpRect, // 출력할 영역 UINT Flags);// 출력 형식 플러그

• uformat– 출력방법을 플래그를 가지고 설정– DT_LEFT | DT_TOP– DT_CENTER | DT_TOP

Page 19: Windows Programming 제대로 배우기

19

텍스트 출력하기

박스 영역 및 좌표 설정 문자출력 박스 영역 및 좌표 설정 문자출력 ExtTextOut ExtTextOut

BOOL ExtTextOut( HDC hdc, // 디바이스 컨텍스 핸들 int X, // 출력 X 좌표 int Y, // 출력 Y 좌표 UINT fuOptions, // 출력 옵션 CONST RECT *lprc, // 출력 박스 영역 LPCTSTR lpString, // 출력 문자열 UINT cbCount, // 출력 문자 길이 CONST INT *lpDx // 문자열의 원점으로부터 출력 값의 배열 );

Page 20: Windows Programming 제대로 배우기

20

색 정의 구조체 COLORREF

COLORREF co=RGB(255,0,0);

문자출력 색설정하기 문자출력 색설정하기 SetTextColor SetTextColor

COLORREF SetTextColor( HDC hdc, // 디바이스 컨텍스트 핸들 COLORREF crColor // 문자열 출력 칼라 );

Page 21: Windows Programming 제대로 배우기

21

선박스 도형 출력하기

라인 그리기 라인 그리기

BOOL MoveToEx( HDC hdc, // 디바이스 컨텍스트 핸들 int X, // 새로운 위치의 x 좌표 int Y, // 새로운 위치의 y 자표 LPPOINT lpPoint // 이전 위치 좌표 );

typedef struct tagPOINT { // pt LONG x; LONG y; } POINT;

Page 22: Windows Programming 제대로 배우기

22

선박스 도형 출력하기

라인 그리기 라인 그리기

BOOL LineTo( HDC hdc, // 디바이스 핸들 int nXEnd, // 그리는 좌표 종점 x int nYEnd // 그리는 좌표 종점 y );

Page 23: Windows Programming 제대로 배우기

23

선박스 도형 출력하기

박스 그리기 박스 그리기

BOOL Rectangle( HDC hdc, // 디바이스 컨텍스트 핸들 int nLeftRect, // 좌측 x 좌표 int nTopRect, // 상단 y 좌표 int nRightRect, // 우측 x 좌표 int nBottomRect // 하단 y 좌표 );

Page 24: Windows Programming 제대로 배우기

24

Rect Operation Function• Rect( 영역 ) 을 사용하고 조작하는데 사용되는

유용한 함수

– OffsetRect : 주어진 Rect 를 dx, dy 만큼 이동– InflateRect : 주어진 Rect 를 dx, dy 만큼 늘이거나

줄임– IntersectRect : 두 개의 Rect 가 교차되었는 지

검사– UnionRect : 두 Rect 를 Union 시킴– PtInRect : 특정좌표 pt 가 영역안에 있는 지 검사

Page 25: Windows Programming 제대로 배우기

25

선박스 도형 출력하기

박스 그리기 박스 그리기

BOOL RoundRect( HDC hdc, // 디바이스 컨텍스트 핸들 int nLeftRect, // 좌측 x 좌표 int nTopRect, // 상단 y 좌표 int nRightRect, // 우측 x 좌표 int nBottomRect, // 하단 y 좌표 int nWidth, // 모서리의 가로측 지름 int nHeight // 모서리의 세로측 지름 );

Page 26: Windows Programming 제대로 배우기

26

선박스 도형 출력하기

박스 그리기 예제박스 그리기 예제

// 박스 그리기 Rectangle(hdc,0,0,100,100); // 라운드 박스 그리기 RoundRect(hdc,0,0,100,100,20,20);

Page 27: Windows Programming 제대로 배우기

27

선박스 도형 출력하기

다양한 원 그리기 다양한 원 그리기

BOOL Ellipse( HDC hdc, // handle to device context int nLeftRect, // 좌측 x 좌표 int nTopRect, // 상단 y 좌표 int nRightRect, // 우측 x 좌표 int nBottomRect // 하단 y 좌표 );

BOOL Pie(

HDC hdc, // 디비이스 컨텍스 핸들

int nLeftRect, // 좌측 x 좌표

int nTopRect, // 상단 y 좌표

int nRightRect, // 우측 x 좌표

int nBottomRect, // 하단 y 좌표

int nXRadial1, // 그리기를 시작하는 x지점

int nYRadial1, // 그리기를 시작하는 y지점

int nXRadial2, // 그리기를 종료하는 x지점

int nYRadial2 // 그리기를 종료하는 y 지점

);

Page 28: Windows Programming 제대로 배우기

28

선박스 도형 출력하기 다양한 원 그리기다양한 원 그리기

BOOL Chord(

HDC hdc, // 디비이스 컨텍스 핸들

int nLeftRect, // 좌측 x 좌표

int nTopRect, // 상단 y 좌표

int nRightRect, // 우측 x 좌표

int nBottomRect, // 하단 y 좌표

int nXRadial1, // 그리기를 시작하는 x 지점

int nYRadial1, // 그리기를 시작하는 y 지점

int nXRadial2, // 그리기를 종료하는 x 지점

int nYRadial2 // 그리기를 종료하는 y 지점

);

BOOL Arc(

HDC hdc, // 디바이스 컨텍스 핸들

int nLeftRect, // 좌측 x 좌표

int nTopRect, // 상단 y 좌표

int nRightRect, // 우측 x 좌표

int nBottomRect, // 하단 y 좌표

int nXRadial1, // 그리기를 시작하는 x 지점

int nYRadial1, // 그리기를 시작하는 y 지점

int nXRadial2, // 그리기를 종료하는 x 지점

int nYRadial2 // 그리기를 종료하는 y 지점

);

Page 29: Windows Programming 제대로 배우기

29

선박스 도형 출력하기

Page 30: Windows Programming 제대로 배우기

30

선박스 도형 출력하기

예제예제

Ellipse(hdc,0,0,100,100); Arc(hdc,0,0,100,100,50,0,100,50); Chord(hdc,0,0,100,100,50,0,0,50); Pie(hdc,0,0,100,100,50,0,0,50);

Page 31: Windows Programming 제대로 배우기

31

선박스 도형 출력하기

다각형과 폴리라인다각형과 폴리라인

BOOL Polyline( HDC hdc, // 디바이스 컨텍스트 핸들 CONST POINT *lppt, // 그릴 좌표 int cPoints // 좌표의 수 );

BOOL Polygon( HDC hdc, // 디바이스 컨텍스트 핸들 CONST POINT *lppt, // 그릴 좌표 int cPoints // 좌표의 수 );

Page 32: Windows Programming 제대로 배우기

32

선박스 도형 출력하기

여러점의 다각형을 그리는 예입니다여러점의 다각형을 그리는 예입니다 . .

POINT pgon[4]={308,120,440,118,380,212,308,120};

Polygon(hdc,pgon,4);

Page 33: Windows Programming 제대로 배우기

33

펜과 브러쉬

HPEN CreatePen( int fnPenStyle, // 펜의 스타일 int nWidth, // 펜의 굵기 COLORREF crColor // 펜의 색 );

HPEN pen; pen=CreatePen(PS_SOLID,1,RGB(255,0,0));

Page 34: Windows Programming 제대로 배우기

34

펜과 브러쉬

HBRUSH CreateSolidBrush( COLORREF crColor // 브러쉬의 색 );

Page 35: Windows Programming 제대로 배우기

35

펜과 브러쉬 case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect(hwnd,&rect); // 청색 펜을 만든다 . hPen=CreatePen(PS_SOLID,2,RGB(0,0,255)); // 적 , 녹 , 청 색의 브러쉬를 만든다 . hBrushR=CreateSolidBrush(RGB(255,0,0)); hBrushG=CreateSolidBrush(RGB(0,255,0)); hBrushB=CreateSolidBrush(RGB(0,0,255)); //DC 에 설정 oldPen=SelectObject(hdc,hPen); oldBrush=SelectObject(hdc,hBrushR); // 박스 그리기 Rectangle(hdc,rect.left+10,rect.top+10,rect.right-10,rect.bottom-10);

// 라운드 박스 그리기

RoundRect(hdc,rect.left+20,rect.top+20,rect.right-20, rect.bottom-20,20,20);

SelectObject(hdc,hBrushG);

Page 36: Windows Programming 제대로 배우기

36

펜과 브러쉬 // 원 그리기

Ellipse(hdc,rect.left+30,rect.top+30,rect.right-30,rect.bottom-30);

// 직선 그리기

MoveToEx(hdc,rect.left+10,rect.top+10,&prevpos);

LineTo(hdc,rect.right-10,rect.bottom-10);

SelectObject(hdc,hBrushB);

// 베지어 곡선

PolyBezier(hdc,pline,4);

// 폴리 라인

Polyline(hdc,pline,6);

// 다각형

Polyline(hdc,pgon,4);

SelectObject(hdc,oldPen);

SelectObject(hdc,oldBrush);

DeleteObject(hPen);

DeleteObject(hBrushR);

DeleteObject(hBrushG);

DeleteObject(hBrushB);

Page 37: Windows Programming 제대로 배우기

37

실습과제

• 모든 가능한 도형들을 색을 넣어서 그리시오 .