U E D R S I H C RSS
ID
Password
Join
당신 스스로가 하지 않으면 아무도 당신의 운명을 개선시켜 주지 않을 것이다. -B.브레히트



Contents

1 참고링크
2 준비

2 준비 #

  1. win32api/기본구조의 뼈대소스를 가져와 새로운 프로젝트를 만들고 생성해봅니다.
  2. 윈도우프로시져부분을 다음과 같이 수정합니다.
    /* 이 함수는 윈도우즈 함수 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;
    }
    

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:54
Processing time 0.5540 sec