Download presentation
Presentation is loading. Please wait.
1
Lab 2 Guide: 교재 3장 그래픽 예제 (175-188쪽) - 펜과 브러시로 그리기 - 튀는 공
2
실습 목적 및 장비 실습 목적 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0)
그래픽 프로그래밍의 이해 디바이스 컨텍스트 사용법 GDI 객체 사용법 그리기 함수들의 응용 타이머 응용 타이머의 설정 타이머 이벤트 처리 장비: PC, 윈도우 운영체제, Visual Studio (VC++ 6.0)
3
1. 펜과 브러시로 그리기 예제 프로그램 개요 Single Document 애플리케이션
타이머의 진행에 따라 다양한 색상의 브러시와 다양한 색상 및 굵기의 펜을 사용하여 선, 사각형, 타원, 둥근 모서리 사각형, 현, 파이 등을 그림 실행 파일(
4
타이머 사용 타이머 설정: SetTimer() 함수 타이머 종료: KillTimer(UINT nIDEvent) 함수
CWnd 클래스의 멤버 함수 타이머를 설정하여 두면 지정된 시간 간격으로 WM_TIMER 메시지 발생 OnTimer() 메시지 핸들러 함수 또는 지정된 함수가 호출됨 타이머 종료: KillTimer(UINT nIDEvent) 함수 타이머 이벤트 처리: 뷰 클래스의 OnTimer(UINT nIDEvent) SetTimer(UINT nIDEvent, UINT nElapse, NULL); Timer ID (여러 개의 타이머 설정가능) 타이머 시간 간격 (1/1000초 단위) 메시지 핸들러 함수 (default: OnTimer()) SetTimer(0,1000,NULL); SetTimer(1, 800, NULL);
5
펜과 브러시로 그리기 예제 프로그램 시작 시 타이머를 켜고 종료 시 타이머 끔
- CGDIDemoView::OnInitialUpdate() 함수 안에서 SetTimer(0, 100, NULL); - CGDIDemoView::OnDestroy() 함수 안에서 KillTimer(0); 2. WM_TIMER 메시지 핸들러 작성 - void CGDIDemoView::OnTimer(UINT nIDEvent)
6
펜과 브러시로 그리기 예제 (OnTimer() 함수)
void CGDIDemoView::OnTimer(UINT nIDEvent) { CClientDC dc(this); // 화면 출력을 위한 DC 클래스 CRect rect; // 화면 크기를 얻기 위한 변수 CBrush brush, *pOldBrush; // 브러시 오브젝트 CPen pen, *pOldPen; // 펜 오브젝트 int x1,y1,x2,y2,x3,y3,x4,y4; // 화면 좌표 int r,g,b; // 컬러 int nObject; // 그래픽 타입 GetClientRect(rect); // 화면의 크기를 얻는 함수
7
펜과 브러시로 그리기 예제 (OnTimer() 함수)
r = rand() % 255; // 컬러를 랜덤하게 설정 g = rand() % 255; b = rand() % 255; brush.CreateSolidBrush(RGB(r,g,b)); // 브러시 생성 pOldBrush = (CBrush *)dc.SelectObject(&brush); // DC에 브러시 선택 r = rand() % 255; // 컬러를 랜덤하게 설정 pen.CreatePen(PS_SOLID, 5, RGB(r,g,b)); // 펜 생성 pOldPen = (CPen *)dc.SelectObject(&pen); // DC에 펜 선택
8
펜과 브러시로 그리기 예제 (OnTimer() 함수)
x1 = rand() % rect.right; // 좌표를 랜덤하게 설정 y1 = rand() % rect.bottom; x2 = rand() % rect.right; y2 = rand() % rect.bottom; x3 = rand() % rect.right; y3 = rand() % rect.bottom; x4 = rand() % rect.right; y4 = rand() % rect.bottom; nObject = rand() % 6; // 그래픽 타입을 랜덤하게 설정
9
펜과 브러시로 그리기 예제 (OnTimer() 함수)
switch(nObject) { case 0: // 라인 그리기 dc.MoveTo(x1,y1); dc.LineTo(x2,y2); break; case 1: // 사각형 그리기 dc.Rectangle(x1,y1,x2,y2); case 2: // 타원 그리기 dc.Ellipse(x1,y1,x2,y2);
10
펜과 브러시로 그리기 예제 (OnTimer() 함수)
case 3: // 둥근 사각형 그리기 dc.RoundRect(x1,y1,x2,y2,x3,y3); break; case 4: // 현 그리기 dc.Chord(x1,y1,x2,y2,x3,y3,x4,y4); case 5: // 파이 그리기 dc.Pie(x1,y1,x2,y2,x3,y3,x4,y4); }
11
펜과 브러시로 그리기 예제 (OnTimer() 함수)
dc.SelectObject(pOldPen); // DC 복원 dc.SelectObject(pOldBrush); // DC 복원 CView::OnTimer(nIDEvent); }
12
실습 문제 선, 사각형, 타원, 둥근 모서리 사각형, 현, 파이 대신에 3차원 사각형, 문자 를 그린다
선, 사각형, 타원, 둥근 모서리 사각형, 현, 파이 대신에 3차원 사각형, 문자 를 그린다 문자의 경우 글꼴, 크기, 문자 값이 매번 변경되도록 한다 문자 값의 범위는 ‘A’에서 ‘Z’로 한다.
13
2. 튀는 공 예제 프로그램 개요 Single Document 애플리케이션
실행 파일(
14
타이머의 설정과 종료 void CBounceView::OnInitialUpdate() {
CView::OnInitialUpdate(); // 0.05초마다 WM_TIMER 메시지가 발생하도록 설정 SetTimer(0, 50, NULL); } void CBounceView::OnDestroy() CView::OnDestroy(); // 타이머를 꺼줌 KillTimer(0);
15
OnTimer() #define R 20 #define STEP 5
void CBounceView::OnTimer(UINT nIDEvent) { CClientDC dc(this); static int nX=R, nY=R; // 현재 공의 위치 static int nCX=STEP, nCY=STEP; // 공의 이동 방향 CRect rect; // 클라이언트 영역의 크기 GetClientRect(&rect); // 클라이언트 영역의 크기를 얻음
16
OnTimer() // 이전 공을 지우기 위해 흰색 브러시를 선택
dc.SelectStockObject(WHITE_BRUSH); dc.Ellipse(nX-R,nY-R,nX+R,nY+R); // 원 그리기 // x 좌표 변경 if (nX < R) nCX = STEP; else if (nX > rect.Width()-R) nCX = -STEP; nX += nCX; //y 좌표 변경 if (nY < R) nCY = STEP; else if (nY > rect.Height()-R) nCY = -STEP; nY += nCY;
17
OnTimer() // 새로 공을 그리기 위해 빨간색 브러시 생성 CBrush brush, *pOldBrush;
brush.CreateSolidBrush(RGB(255,0,0)); // DC에 빨간색 브러시 선택 pOldBrush = (CBrush *)dc.SelectObject(&brush); dc.Ellipse(nX-R,nY-R,nX+R,nY+R); // 원 그리기 dc.SelectObject(pOldBrush); // DC 복원 CView::OnTimer(nIDEvent); }
18
실습 문제 Bounce 예제에 두 개의 움직이는 물체를 둔다 두 번째 물체의 모양도 원으로 하되 색상과 선의 굵기는 달리 한다
두 번째 물체는 첫 번째 물체보다 빠르게 움직인다
Similar presentations