당신 스스로가 하지 않으면 아무도 당신의 운명을 개선시켜 주지 않을 것이다. -B.브레히트
2 준비 #
- win32api/기본구조의 뼈대소스를 가져와 새로운 프로젝트를 만들고 생성해봅니다.
- 윈도우프로시져부분을 다음과 같이 수정합니다.
/* 이 함수는 윈도우즈 함수 DispatchMessage()를 호출할 때 실행됩니다. */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static POINT points[512]; static bool movemodes[512]; static int point_num = 0; static bool prev_movemodes = 0; // 0 : MoveToEx(), 1 : LineTo() switch (message) /* 메세지에 따라 분기합니다 */ { case WM_RBUTTONDOWN: point_num = 0; // 모든 그림기록을 지운다. break; case WM_MOUSEMOVE: // 만일 point_num가 한계를 넘어가면 그냥 break한다. if ( point_num == 512 ) break; // 좌표를 배열에 대입한다. points[point_num].x = LOWORD(lParam); points[point_num].y = HIWORD(lParam); movemodes[point_num] = prev_movemodes; // 왼쪽 버튼을 누르고 있는 동안만 배열에 추가한다. 이렇게 하면 배열안에 공간이 절약된다. if ( (wParam & MK_LBUTTON) ) point_num++; // 왼쪽 버튼이 눌려있는 여부로 현재 그릴것인지 여부를 결정한다. prev_movemodes = (bool)(wParam & MK_LBUTTON); InvalidateRect( hwnd, NULL, TRUE); break; case WM_PAINT : { PAINTSTRUCT ps; HDC hdc = BeginPaint( hwnd, &ps ); MoveToEx(hdc, points[0].x, points[0].y, NULL); for (int i = 0; i < point_num; i++) { if (movemodes[i]) LineTo(hdc, points[i].x, points[i].y); else MoveToEx(hdc, points[i].x, points[i].y, NULL); } { char buf[512]; sprintf(buf, "%d개 저장중", point_num); TextOut(hdc, 10, 30, buf, strlen(buf)); } if ( point_num == 512 ) TextOut(hdc, 10, 10, "오버플로우!", 11); EndPaint( hwnd, &ps ); } break; case WM_DESTROY: PostQuitMessage (0); /* 메세지 큐에 WM_QUIT 메세지를 보냅니다. */ break; default: /* 다루지 않은 메세지는 모두 운영체계에게 넘깁니다. */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }









![[http]](/wiki/imgs/http.png)
