목차 반응형 #define R 20 // 반지름 int x,y; // 공의 좌표 int xi,yi; // 한번에 이동하는 거리 void OnTimer() { RECT crt; // GetClientRect(hWndMain,&crt); // 좌 or 우 측 벽에 맞는다면... if (x <= R || x >= crt.right-R) { xi*=-1; // 음수를 곱해서 튕기는 방향 변경. } // 위 or 아래 벽에 맞는다면... if (y <= R || y >= crt.bottom-R) { yi*=-1; // 음수를 곱해서 튕기는 방향 변경. } x+=xi; y+=yi; // 전체 무효화 //InvalidateRect(hWndMain,NULL,TRUE); /* 공 주변만 무효화 */ // 클리핑 영역 지정- BeginPaint 에서만 할수 있음. RECT rt; SetRect(&rt,x-R-5,y-R-5,x+R+5,y+R+5); InvalidateRect(hWndMain,&rt,TRUE); } LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { HDC hdc; // DC 핸들 PAINTSTRUCT ps; // PAINT 용 PAINTSTRUCT 구조체 HPEN hPen,OldPen; // 펜 핸들, 변경 전 펜 설정을 저장할 핸들 HBRUSH hBrush,OldBrush; // 브러쉬 핸들, 변경 전 브러쉬 설정을 저장할 핸들 RECT crt; // 사각형 좌표 저장 구조체 int i; switch (iMessage) { case WM_CREATE: x=50; // 최초 공의 좌표 x y=50; // 최초 공의 좌표 y xi=4; // 한번에 공이 이동하는 거리 x yi=5; // 한번에 공이 이동하는 거리 y SetTimer(hWnd,1,25,NULL); // 타이머 지정 return 0; case WM_TIMER: OnTimer(); return 0; case WM_PAINT: hdc=BeginPaint(hWnd, &ps); GetClientRect(hWnd,&crt); for (i=0;i<crt.right;i+=10) { MoveToEx(hdc,i,0,NULL); LineTo(hdc,i,crt.bottom); } for (i=0;i<crt.bottom;i+=10) { MoveToEx(hdc,0,i,NULL); LineTo(hdc,crt.right,i); } hPen=CreatePen(PS_INSIDEFRAME,5,RGB(255,0,0)); OldPen=(HPEN)SelectObject(hdc,hPen); hBrush=CreateSolidBrush(RGB(0,0,255)); OldBrush=(HBRUSH)SelectObject(hdc,hBrush); Ellipse(hdc,x-R,y-R,x+R,y+R); DeleteObject(SelectObject(hdc,OldPen)); DeleteObject(SelectObject(hdc,OldBrush)); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); KillTimer(hWnd,1); return 0; } return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } 반응형 공유하기 게시글 관리 구독하기Lee's Lab 저작자표시 목차 목차 닫기