Drawing

WM_PAINT message handler -> OnPaint 함수를 이용

CPaintDC dc(this); // 그리기 위한 디바이스 컨텍스트

 

dc.Rectangle(x1,y1,x2,y2); 사각형

dc.Ellipse(x1,y1,x2,y2); 원형

 

WM : 윈도우에서 제공하는 기본  메세지

WM_PAINT : 화면을 다시 그릴 필요가 있다고 판단될 경우 발생하는 메세지

- 무효 영역 : 윈도우의 일부가 지워졌을 때 지워진 작업 영역을 무효로 만들어 다시 그리도록 하는 것

-> 다시 그리도록 강제 무효화 함수 InvalidateRect

 

WM_PAINT 호출시기 (OS가 호출)

1. 윈도우가 생성될 때

2. 윈도우 크기 변경, 최소화, 최대화 시

3. 다른 윈도우에 가려졌다가 다시 나타날 때

 

Invalid region을 강제로 호출하는 함수 (위 3가지 경우 외에 강제 호출하는 함수)

void CWnd::Invalidate(BOOL bErase = TRUE);

void CWnd::InvalidateRect(LPCRECT IpRect, BOOL bErase = TRUE);

 

CPaintDC : 클라이언트 영역에 출력(WM_PAINT 메세지 핸들러에만 사용)

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

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

CMetaFileDC : 메타 파일에 출력

 

Mouse button handler

->WM_LBUTTONDOWN

->WM_RBUTTONDOWN
->WM_MBUTTONDOWN

 

Point

- GetPixel();

- SetPixel();

- SetPixelV(); -> SetPixel과 같지만 return 하지 않기에 더 빠르다

 

예제 문제

for (int i = 0; i < 255; i++)
{
for (int j = 0; j < 255; j++)
{
dc.SetPixelV(j, i, RGB(j, i, 255)); //j부터 그리고 i줄로 넘어가는 방식이며 색은 RGB값 적용

}

 

Line

- MoveTo() : current location

- LineTo() : draw a line from the current position to a specific position

dc.MoveTo(x1,y1);

dc.LineTo(x2,y2);

 

GetClientRect(CRect)

CRect : class to store rectangle information

Crect rect;

GetClientRect(rect)

 

GDI Object

펜 / 선그릴 때 / CPen

브러시 / 면 내부 채울 때 / CBrush

폰트 / 문자 출력 / CFont

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

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

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

 

1. 팬 정의(객체)

2. DC에 객체 연결 CDC::SelectObject

3. 그림 그리기

4. 사용 객체 연결 해제

 

브러쉬

브러쉬 종류

1. 솔리드(속이 채워짐 : Solid : default) CBrush brush(RGB(255,0,0));

2. 해치 (교차된 평행선 : Hatch) CBrush brush(HS_DIAGCROSS, RGB(255,0,0);

3. 패턴 (비트맵의 반복 무늬 : Pattern) CBitmap bitmap; bitmpa.LoadBitmap(IDB_BITMAP1); CBrush brush(&bitmap);

 

폰트

CFont font

font.CreateFont(...); ex) 400, "Arial"

텍스트 호출 : dc.TextOut(x,y,Text); or dc.DrawText(Text,도형(ex) rect), DT_CENTER|DT_VCENTER|DT_SINGLELINE );

 

CRgn 사용

CRgn rgn

rgn.CreatePolygonRgn(CPoint * pt, int nNumber, int nStyle);

dc.PaintRgn(&rgn);

 

nStyle = WINDING or ALTERNATE

WINDING

- 각 교점에 대해 카운터 관리 (0은 외부, 나머지 내부)

- 시계방향 = 카운트 증가, 반시계 방향 카운트 감소

ALTERNATE

- 홀수면 내부 ,짝수는 외부

'학교수업' 카테고리의 다른 글

인공지능개론 3주차  (0) 2022.03.21
컴퓨터 구조 3주차  (0) 2022.03.21
UNIX서버 2주차  (0) 2022.03.16
컴퓨터 그래픽스 기초 2주차  (0) 2022.03.16
게임공학개론 2주차  (0) 2022.03.16

+ Recent posts