Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture 3 Graphics with GDI

Similar presentations


Presentation on theme: "Lecture 3 Graphics with GDI"— Presentation transcript:

1 Lecture 3 Graphics with GDI

2 목차 그래픽의 기본 GDI Device Context DC를 이용한 하드웨어 독립적인 프로그래밍 GDI 오브젝트 클래스
그래픽 옵션 바꾸기 글꼴과 텍스트 출력

3 1. 그래픽의 기본 윈도우 그래픽 관련 용어 윈도우는 강력한 그래픽 기능 지원
 프로그래머는 윈도우 운영체제에서 지원하는 그래픽 기능을 호출하여 복잡한 그래픽 기능을 간단히 수행 관련 용어 그래픽 디바이스 인터페이스(GDI: Graphics Device Interface) 디바이스 컨텍스트(DC: Device Context) GDI 오브젝트 (GDI Object)

4 2. GDI(Graphics Device Interface)
윈도우 운영체제에서 디바이스 드라이버를 이용하여 하드웨어 독립적인 프로그래밍이 가능 GDI: 윈도우 운영체제들이 공통적으로 응용 프로그램에 제공하는 그래픽 기능 응용 프로그램 윈도우 운영체제 디바이스 드라이버 디바이스(하드웨어) 하드웨어 독립적 하드웨어 종속적

5 3. DC(Device Context) 디바이스 컨텍스트(DC)란?
디스플레이나 프린터와 같은 장치의 그리기 속성에 관한 정보를 가지고 있는 윈도우 자료 구조체 선, 도형, 그림과 관련된 옵션들을 DC에 모아놓고 그래픽 함수들은 이 DC 안의 값들을 참조 DC의 옵션들은 기본 값들이 정해져 있으며 변경 가능 관련 클래스

6 Device Context Classes (MFC)
CDC 디바이스 컨텍스트를 구현한 클래스 그래픽을 위한 필요한 대부분의 GDI 함수들을 멤버 함수로 구현(약 200여 개에 달하는 멤버 함수를 가짐) 화면에 출력하기 위해서는 CDC의 객체가 있어야 함 GetDC() 함수는 현재의 객체를 포함하는 윈도우의 클라이언트 영역을 나타내는 DC를 돌려줌 DC는 자원이므로 작업 끝난 후에는 ReleaseDC() 함수를 사용하여 반환해야 함  아니면 자원 고갈 우려 CDC *pDC = GetDC(); pDC->Rectangle(10,10,100,100); ReleaseDC(pDC);

7 Device Context Classes (MFC)
CClientDC 클래스 지정된 윈도우의 클라이언트 영역을 나타냄 GetDC()와 ReleaseDC()를 생성자와 소멸자에서 자동 수행 현재의 윈도우를 가리키는 포인터 CClientDC dc(this); dc.Rectangle(10,10,100,100);

8 Device Context Classes (MFC)
CWindowDC 클라이언트 영역이 아닌 곳에 출력을 하고자 할 때 사용  타이틀바, 메뉴바, 스크롤바 등) CPaintDC 클래스 WM_PAINT 메시지가 전달된 경우에 사용 WM_PAINT는 윈도우의 클라이언트의 내용이 다시 그려질 필요가 있을 때 전달되는 메시지 CMetaFileDC 클래스 원하는 그림의 생성을 위해 replay 할 수 있는 GDI 명령 sequence를 담고 있는 메타 파일

9 4. DC를 이용한 하드웨어 독립적인 프로그래밍 DC는 윈도우를 구분함

10 DC를 이용한 하드웨어 독립적인 프로그래밍 DC는 디바이스 자체도 구분
동일한 코드로 팩스 모뎀, 화면, 프린터, 플로터 등에 전송할 수 있음

11 5. GDI 오브젝트 클래스 GDI 오브젝트란 ? GDI 오브젝트들 DC 옵션들은 여러 개의 범주로 그룹화 되어 있음
DC 옵션 범주를 나타내는 클래스들이 있으며, 그 인스턴스가 GDI 오브젝트 GDI 오브젝트들 Bitmap : 비트맵 그림 Brush : 영역 내부를 채울 때 사용되는 픽셀의 색, 패턴 Font : 문자 출력 시 글꼴 모양, 크기 등 Pen : 선이나 영역 경계선의 색상, 두께, 패턴 Palette: 색상 수가 제한되는 상황에서 실제로 출력될 색상 세트 Region: 그림 그릴 영역을 나타내는 타원 또는 다각형 설정

12 GDI 오브젝트 클래스 GDI 오브젝트 클래스 DC 옵션들의 설정
MFC 클래스 기본 값 CPen 1픽셀 굵기의 검은 색 실선 브러시(붓) CBrush 단일 흰색 브러시 글꼴 CFont 시스템 글꼴 비트맵 CBitmap 없음 팔레트 CPalette 영역 CRgn

13 펜과 브러쉬 펜과 브러쉬를 이용한 그래픽 현재 DC에 설정되어 있는 펜을 이용하여 경계선을 그림
함수 (CDC 클래스의 멤버함수) 그리기 기능 MoveTo, LineTo Rectangle, FillRect, FrameRect, Draw3dRect 사각형 Ellipse 타원 Pie 파이 Arc Polygon 다각형 PolyDraw, PolyBezier, PolyBezierTo 베지어 곡선 FrameRgn 영역의 경계선

14 6. 그래픽 옵션 바꾸기 펜 생성 예제 CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); CClientDC dc(this); dc.SelectObject(&pen); dc.Rectangle(10, 10, 100, 100); 어떤 문제가 존재?

15 그래픽 옵션 바꾸기 새로운 펜으로 선택하고 되돌리지 않으면 함수가 종료되는 순간에 DC에 저장되어 있던 펜 오브젝트는 파괴
SelectObject 함수의 리턴값으로 넘어오는 GDI 오브젝트를 저장해 두었다가 옵션 복원에 사용 CPen pen; pen.CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); CClinetDC dc(this); CPen *pOldPen = (CPen *)dc.SelectObject(&pen); dc.Rectangle(10, 10, 100, 100); dc.SelectObject(pOldPen);

16 내장(Stock) GDI 오브젝트 자주 쓰이는 GDI 클래스의 오브젝트는 윈도우 운영체제가 내장하고 있음
GetStockObject 함수로 이용할 수 있음 내장 오브젝트는 항상 메모리에 상주하므로 이전 DC 값으로 환원할 필요 없음 CClientDC dc(this); dc.SelectObject(GetStockObject(WHITE_PEN));

17 내장(Stock) GDI 오브젝트 GDI 오브젝트 종류 내장 GDI 오브젝트 BLACK_PEN WHITE_PEN 펜
NULL_PEN 브러시 BLACK_BRUSH WHITE_BRUSH DKGRAY_BRUSH GRAY_BRUSH HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH 글꼴 ANSI_FIXED_FONT ANSI_VAR_FONT DEVICE_DEFAULT_FONT OEM_FIXED_FONT SYSTEM_FONT

18 7. 글꼴과 텍스트 출력 LOGFONT: 논리적 글꼴의 표현을 위한 구조체 typedef struct tagLOGFONTW {
LONG lfHeight; // 높이 LONG lfWidth; // 너비 LONG lfEscapement; // 방향 LONG lfOrientation; // 회전 각도 LONG lfWeight; // 굵기 BYTE lfItalic; // 기울임꼴 BYTE lfUnderline; // 밑줄 BYTE lfStrikeOut; // 취소선 BYTE lfCharSet; // 문자 세트 BYTE lfOutPrecision; // 출력 정확도 BYTE lfClipPrecision; // 클리핑 정확도 BYTE lfQuality; // 출력의 질 BYTE lfPitchAndFamily; // 자간 TCHAR lfFaceName[LF_FACESIZE]; // 글꼴 이름 } LOGFONT;

19 글꼴과 텍스트 출력 CFont 클래스의 멤버 함수 CreateFont(): 폰트의 생성과 설정
BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename ); 폰트의 생성과 설정 CFont newFont, *pOldFont; newFont.CreateFont(100, 0, 0, 0, 400, FW_NORMAL, FALSE, FALSE, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, _T(“Times New Romans”)); pOldFont = (CFont *)pDC->SelectObject(&newFont);

20 글꼴과 텍스트 출력 텍스트 출력 함수 BOOL TextOut( int x, int y, const CString& str );
int DrawText( const CString& str, LPRECT lpRect, UINT nFormat ); dc.TextOut(40, 60, “Hello”); CRect rect; GetClientRect(&rect); // 클라이언트 영역의 크기를 얻어냄 dc.DrawText("Hello", &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);

21 글꼴과 텍스트 출력 텍스트 색상 및 배경 색상 변경 텍스트 배경 모드 변경 CFontDialog
dc.SetTextColor(RGB(255, 0, 0)); dc.SetBkColor(RGB(0, 0, 255)); 텍스트 배경 모드 변경 dc.SetBkMode(TRANSPARENT); // 투명 dc.SetBkMode(OPAQUE); // 불투명: 배경 색상 적용 CFontDialog 글꼴 정보를 입력 받기 위한 공통 다이얼로그 예제 파일 (


Download ppt "Lecture 3 Graphics with GDI"

Similar presentations


Ads by Google