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 |