728x90
반응형
#include <math.h>
#define BTN1 1000
#define BTN2 ((BTN1)+1)
HWND hwndButton1;
HWND hwndButton2;
#define _PI 3.141592f 
int Count = 0;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:     //윈도우 생성시 발생되는 message
    {   
        Count = 0;
        // HWND hwndButton1  전역변수화
        hwndButton1 =
            CreateWindowW(TEXT("BUTTON"), TEXT("회전"),       //캡션
                WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                10, 10, 50, 30,
                hWnd, (HMENU)1000, hInst, NULL);
        //HWND hwndButton2  전역변수화
        hwndButton2 =
            CreateWindowW(TEXT("BUTTON"), TEXT("정지"),       //캡션
                WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                10, 60, 50, 40,
                hWnd, (HMENU)2000, hInst, NULL);
        //많은 버튼생성시 반복문 사용가능, TEXT, 좌표, ID등을 배열에 저장하여 사용가능
    }break;
    case WM_TIMER:
    {
        switch (wParam)
        {
        case 99:
        {
            RECT rc = { 100, 200, 300, 400 };
            InvalidateRect(hWnd, NULL, true);
            //f5를 통해서 디버깅 시 출력창 출력
        }
        break;
        case 88:
        {
            WCHAR str[32] = { 0, };
            static int count = 0;
            wsprintf(str, TEXT("timer2 개수%d \n"), count++);
            OutputDebugString(str);
            //f5를 통해서 디버깅 시 출력창 출력
        }
        break;
        }
    }
    break;
    case WM_COMMAND:
    {
        switch (wParam)
        {
        case 1000: //wParam==1000 - ID가 1000인 버튼1
        {

            HANDLE hTimer = (HANDLE)SetTimer(
                hWnd,
                99,      //Timer ID
                1000,   //1000ms= 1s 한번 메세지 WM_TIMER 발생
                NULL    // 속성
            );
            HANDLE hTime1r1 = (HANDLE)SetTimer(hWnd, 99, 50, NULL);
            //wParam ==99
            HANDLE hTime1r2 = (HANDLE)SetTimer(hWnd, 88, 700, NULL);
            //wParam ==88
        }
        break;
        case 2000: //wParam==2000 - ID가 2000인 버튼2
        {

            KillTimer(hWnd, 99);// 핸들, ID
        }
        break;
        }
    }
    break;
    case WM_PAINT:
    {
        #define ANGULAR 5
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다...
        RECT rc;
        GetClientRect(hWnd, &rc);
        int CenterclientX = rc.right / 2;             // client 창의 x 중심
        int CenterclientY = rc.bottom / 2;            // client 창의 y 중심
                                                      // 오각형의 무게중심 좌표
        int Radius = 100;                               // 정오각형에 외접하는 원의 반지름 정의 즉, 오각형의 크기를 지정
        float angle = (2.0f * _PI) / ANGULAR;      // 무게중심을 기준으로 각의 크기 마다 변하는 각도 라디안 계산 ex) 정오각형 : 72도
        int StartDrawX = CenterclientX + sinf(Count) * Radius;
        int StartDrawY = CenterclientY + cosf(Count) * Radius;        // 정오각형 아래 꼭지점을 시작으로 정의
        MoveToEx(hdc, StartDrawX, StartDrawY, NULL); // 정오각형 시작점
        int pointX, pointY;                             // 각 꼭지점들의 좌표를 변수로 선언
        for (int i = 0; i < ANGULAR; i++)                     // 각의 개수만큼 반복
        {
            pointX = CenterclientX + sinf(angle * (i + 1) + Count) * Radius; // angle의 값을 변화 시켜주면서 sinf를 통해 x 좌표
            pointY = CenterclientY + cosf(angle * (i + 1) + Count) * Radius; // angle의 값을 변화 시켜주면서 cosf를 통해 y 좌표
            LineTo(hdc, pointX, pointY);                            // 구한 꼭지점의 x,y좌표를 찍어 도형을 그림
        }
        Count += 30;;
        EndPaint(hWnd, &ps);
    }
    break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
728x90
반응형

+ Recent posts