Download presentation
Presentation is loading. Please wait.
1
충북대학교 컴퓨터 그래픽스 연구실 3학기 김일수
그래픽 처리 충북대학교 컴퓨터 그래픽스 연구실 3학기 김일수
2
그래픽 처리 GDI의 개념 Graphic Device Interface
*윈도우가 하드웨어를 제어할 수 있도록 응용 프로그램에 제공하는 모든 기능 *응용 프로그램과 디바이스 드라이버의 중간 역할 *응용 프로그램에 대한 독립적인 그래픽 동작 수행 < 그래픽 처리 >
3
그래픽 처리 GDC(Graphic Device Context)이란?
*디스플레이나 프린터와 같은 장치의 그리기 속성에 관한 정보를 가지고 있는 윈도우 자료 구조체 *선, 도형, 그림과 관련된 옵션들을 DC에 모아놓고 그래픽 함수는 이 DC 값을 참조 (default 사용 가능) *MFC에서는 CDC, CClientDC, CWindowDC, CPaintDC, CMetaFileDC등 다양한 DC 제공 *DC는 GDI가 제공하는 시스템 자원(운영체계는 각 윈도우 마다 DC를 가짐). *독립적인 하드웨어 출력을 할 수 있어 출력 장치에 상관없이 동일한 방법으로 출력을 설정 *DC를 얻고 나면, 반드시 작업 완료시 해제 < 그래픽 처리 >
4
그래픽 처리 CDC의 파생 클래스 *CDC 클래스는 에플리케이션 프로그램에서 화면을 컨트롤하는 핸들을 포함
하고 화면에 관계되는 여러 함수를 내장하고 있는 클래스 < 그래픽 처리 >
5
그래픽 처리 CDC 클래스 얻기 (1)OnDraw()함수, OnPaint()함수를 이용
OnDraw() 함수의 인자 - CDC 오브젝트 Void KisView:: OnDraw(CDC * pDC) { … } OnPaint() 함수 내의 CPaintDC 오브젝트 Void KisView::OnPaint() CPaintDC dc(this) *윈도우나 클라이언트 영역이 다시 그려져야 할 경우 수행 DC의 해제 는 MFC 내부 코드에 존재한다. < 그래픽 처리 >
6
그래픽 처리 (2)GetDC() 함수의 이용 *이 함수의 포인터 반환값을 받아서 사용
*ReleaseDC()함수를 호출하여 반드시 해제 *사용 예 CDC *pDC = GetDC(); … ReleaseDC(pDC); *이 방법으로 DC를 얻는 것은 일시적인 것으로 윈도우의 크기가 변하면 출력한 내용이 사라진다. < 그래픽 처리 >
7
그래픽 처리 (3)CClientDC 클래스의 이용 *CDC 클래스의 파생 클래스
*Device Context의 생성/해제 자동적 수행 1.생성자 함수에서 GetDC()함수를 호출 2.소멸자 함수에서 ReleaseDC()함수를 호출 *윈도우에 대한 핸들값이 필요 *일시적으로 윈도우의 클라이언트 영역에서 그래픽 개체를 사용할 경우에 이용 *사용 예 CClientDC dc(this) … < 그래픽 처리 >
8
그래픽 처리 (4)CWindowDC를 이용 *윈도우(프레임) 영역에 그래픽 요소를 출력하고자 할 때 사용한다.
*GetWindowDC()함수를 이용하여 CWindowDC 클래스의 인스턴스를 포인터 형태로 넘겨 받아 이용 *작업 수행 후, ReleaseDC()함수로 해제 *사용 예 CWindowDC *pDC = GetWindowDC(); … ReleaseDC(pDC); < 그래픽 처리 >
9
그래픽 처리 그래픽 객체 *GDI 기본 구성 요소
그래픽 개체라는 의미는 화면에 그림을 그리거나 문자를 출력할 때 사용하는 객체를 의미 펜과 브러시, 폰트 비트맵 등을 핸들링하는 핸들들을 그래픽객체라고 하며, 이 핸들을 가지고 있는 클래스를 그래픽 객체 클래스라고 함. *GDI 기본 구성 요소 (1)선과 곡선(Lines and Curves) 직선, 사각형, 타원, 호, 베지어 곡선 (2)채워진 영역(Filled Areas) 브러시 개체를 이용 – 색상, 패턴, 비트맵 이미지 (3)비트맵(Bitmaps) 디스플레이 장치의 픽셀과 일치하는 직사각형 배열 래스터 그래픽의 기본적인 도구 (4)텍스트(Text) < 그래픽 처리 >
10
그래픽 처리 화면에 그래픽 출력하기위한 요소 GDI 객체 GDI 객체 클래스 기본값 사용 용도 펜 CPen
검정색, 실선, 1픽셀 크기 점, 선, 테두리 브러시 CBrush 무늬없는 흰색 내부(영역) 채우기 폰트 CFont 시스템 폰트 문자의 폰트 비트맵 CBitmap 없음 비트맵 출력 영역 CRgn 영역 만들기, 변경하기 팔레트 CPalette 팔레트 조작 < 그래픽 처리 >
11
그래픽 처리 Blue 0~255 Zero Green 0~255 Red 0~255 색(COLOR)
COLORREF RGB( // COLORREF : 데이터 type BYTE bRed, // red component of color BYTE bGreen, // green component of color BYTE bBlue // blue component of color ); RGB 매크로 정의 #define RGB (r, g, b) ((DWORD) (((BYTE) (r) | \ ((WORD) (g) << 8)) | (((DWORD) (BYTE) (b)) << 16))) 윈도우는 색상을 표현하기 위해 4byte를 사용 1byte byte 색상표현 일반적으로 사용하지 않는다. (윈도우 RGB 칼라와 16칼라 이상을 지원하는 비디오 디바이스에 대한 칼라 팔레트를 구분하기 위해 사용) RGB 매크로로 표현할 수 있는 색상 256*256*256 = 16,777,216 color Blue 0~255 Zero Green 0~255 Red 0~255 < 그래픽 처리 >
12
그래픽 처리 GDI 객체를 사용하는 방법 (1) GDI 객체를 생성 * Create 계열 함수 이용
(2) 객체를 Device Context에 등록 * SeleteObject() 함수 이용 * 기존 설정된 객체는 포인터로 저장 (3) Device Context를 사용하여 그래픽 출력 (4) 이전 객체로 환원 (5) 객체를 삭제 * DeleteObject() 함수 이용 < 그래픽 처리 >
13
그래픽 처리 펜 (Pen) ※선이나 영역의 경계선을 그릴 때 사용 ※선의 두께, 선이 색상, 선의 스타일 설정
CPen::CreatePen BOOL CreatePen ( int nPenStyle, int nWidth, COLORREF crColor ); BOOL CreatePen ( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL ); Parameters nPenStyle 펜의 스타일, nWidth 펜의 두께 crColor 펜에 대한 RGB 색상, pLogBrush LOGBRUSH 구조체에 대한 포인터 nStyleCount lpStyle 파라미터에 의해 가리키는 스타일의 길이를 기술한다. lpStyle doubleword 값의 배열을 가리킨다. < 그래픽 처리 >
14
그래픽 처리 펜(CPen) 스타일 펜의 스타일 내 용 모 양 PS_SOLID 실선 PS_DASH 파선 PS_DOT 점선
PS_DASHDOT 일점 쇄선 PS_DASHDOTDOT 이점 쇄선 PS_NULL 선을 그리지 않음 < 그래픽 처리 >
15
그래픽 처리 펜(CPen)의 사용법 ① CPen pen, *oldpen;
pen.CreatePen(PS_SOLID, 1,RGB(0,0,0)); ② oldpen=pDC->SelectObject(&pen); ③ pDC->Ellipse(0,0,10,10); ④ pDC->SelectObject(oldpen); ⑤ pen.DeleteObject(); < 그래픽 처리 >
16
그래픽 처리 브러쉬(Brush) ※ 영역의 내부를 채울 때 사용 ※ 채울 색, 패턴등이 사용
(1) CreateSolidBrush() 함수 ※ 단일 색으로 칠하는 브러시를 생성하는 함수 (2) CreateHatchBrush() 함수 ※ 일정한 패턴을 가진 해치 브러시를 생성하는 함수. ※ 해치 브러쉬의 스타일 < 그래픽 처리 >
17
그래픽 처리 해치 브러시의 스타일 내 용 모 양 HS_BDIAGONAL 오른쪽에서 왼쪽으로 45도 내려가는 빗금
HS_CROSS 십자가 형태의 빗금 HS_DIAGCROSS X자 형태의 빗금 HS_FDIAGONAL 왼쪽에서 오른쪽으로 45도 내려가는 빗금 HS_HORIZONTAL 수평으로 빗금 HS_VERTICAL 수직으로 빗금 < 그래픽 처리 >
18
그래픽 처리 브러쉬(Brush)의 사용법 ① CBrush brush, *oldbrush;
brush.CreateSolidBrush(RGB(0,0,0)); brush.CreateHatchBrush(HS_CROSS,RGB(0,0,0)); ② oldbrush=pDC->SelectObject(&brush); ③ pDC->Ellipse(0,0,10,10); ④ pDC->SelectObject(oldbrush); ⑤ brush.DeleteObject(); < 그래픽 처리 >
19
그래픽 처리 폰트(Font) ※ Cfont 클래스를 이용하는 객체로 문자를 출력할 때 사용하며 글자의 모양, 크기가 설정
※ 폰트를 사용하는 방법 (1)폰트를 출력하기 위해서는 원하는 폰트에 대해 논리적인 폰트를 LOGFONT타입으로 기술하여 생성하고 DC에 폰트를 선택하여 넣는다. (2)윈도우 GDI 의 폰트 맵퍼가 시스템에 설치되어 있는 폰트들 중에 가장 가까운 물리적인 폰트를 찾아 출력한다. < 그래픽 처리 >
20
그래픽 처리 < 그래픽 처리 > typedef struct tagLOGFONT {
LONG lfHeight; // 문자 셀이나 문자의 논리적 높이 LONG lfWidth; // 글꼴 내의 문자들의 평균 논리적 너비 LONG lfEscapement; // 폰트에 쓰여진 텍스트의 각 라인의 각도( 1/10도 ) LONG lfOrientation; // 각 문자의 기준선의 각도 ( 1/10도) LONG lfWeight; // 글꼴의 무게 ( 사이) BYTE lfItalic; // TRUE 이면 이태릭체 BYTE lfUnderline; // TRUE 이면 밑줄 BYTE lfStrikeOut; // TRUE 이면 취소선 BYTE lfCharSet; // 글꼴의 문자 집합 BYTE lfOutPrecision; // 출력 정밀도. BYTE lfClipPrecision; // 클리핑 정밀도. 클리핑 경계에 있는 문자들을 처리하는 방법을 정의한다. BYTE lfQuality; // 출력 품질 BYTE lfPitchAndFamily; // 글꼴의 피치와 계열 CHAR lfFaceName[LF_FACESIZE]; // 32자로 제한된 문자열. 글꼴의 서체 이름을 나타낸다. } LOGFONT; < 그래픽 처리 >
21
그래픽 처리 ※ CreateFontIndirect 를 사용하여 바탕체 폰트를 만드는 예 char temp[80]
strcpy(temp, “바탕체”); LOGFONT logfont={10, 10, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, temp[0]}; Font,CreateFontIndirect(&logfone); < 그래픽 처리 >
22
그래픽 처리 비트맵(Bitmap) ※ CBitmap클래스를 이용하는 객체로 비트맵을 생성하거나 읽어서 비트맵을 출력할 때 사용
< 그래픽 처리 >
23
그래픽 처리 흑백에서의 비트 연산 예 원본 그림 COPY OR AND XOR
Ex) pDC->SetRop2(R2_XORPEN); //그래픽을 출력한다. < 그래픽 처리 >
24
그래픽 처리 비트맵의 사용법 ① 화면 DC와 메모리 DC를 생성 ② 화면 DC와 호환성을 갖는 DC를 만든다.
CClinetDC dc(this); CDC memdc; ② 화면 DC와 호환성을 갖는 DC를 만든다. memdc.CreateCompatibleDC(&dc); ③ 비트맵을 읽어온다 CBitmap bitmap, *oldbitmap; Cbitmap.LoadBitmap(IDB_BITMAP1); ④ 메모리 DC에 비트맵을 설정한다. Oldbitmap=memdc.SelectObject(&bitmap); ⑤ 비트맵 블록을 전송한다. dc.BitBlt(0,0,450,85,&memdc,0,0,SRCCOPY); ⑥ DC를 복원한다. memdc.SelectObject(oldbitmap); < 그래픽 처리 >
25
그래픽 처리 펜과 브러쉬를 이용한 그래픽 함수 (CDC 클래스의 멤버함수) 그리기 기능 MoveTo, LineTo 선
Rectangle, FillRect, FrameRect, Draw3dRect 사각형 Ellipse 타원 Pie 파이 Arc 호 Polygon 다각형 PolyDraw, PolyBezier, PolyBezierTo 베이지어 곡선 FrameRgn 영역의 경계선 < 그래픽 처리 >
26
그래픽 처리 그래픽 예제 < 그래픽 처리 >
27
그래픽 처리 < 그래픽 처리 >
Similar presentations