winAPI WM_TIMER WM_PAINT как сделать светофор?

545
20 февраля 2017, 17:51

Начинаю знакомство с WinAPI нужно сделать что-то типа светофора(три серых квадрата и по очередности один из них должен менять цвет) незнаю какое условие сделать поможет кто разобраться?

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static RECT rect1 = { 20,20,200,200 };
static RECT rect2 = { 230,20,420,200 };
static RECT rect3 = { 450,20,640,200 };
static INT id = 0;
switch (message)
{
case WM_COMMAND:
    {
        int wmId = LOWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    }
    break;
case WM_TIMER: 
    {
    }break;
case WM_PAINT:
    {
        id = SetTimer(hWnd, TIMERid, 1000, NULL);
        PAINTSTRUCT ps;
        HBRUSH hbr = CreateSolidBrush(RGB(169, 169, 169));//grey
        FillRect(GetDC(hWnd), &rect1, hbr);
        FillRect(GetDC(hWnd), &rect2, hbr);
        FillRect(GetDC(hWnd), &rect3, hbr);
        EndPaint(hWnd, &ps);
    }
    break;
case WM_DESTROY:
    KillTimer(hWnd, TIMERid);
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Answer 1

решил так Если есть другие варианты - пишите


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static RECT rect1 = { 20,20,200,200 };
    static RECT rect2 = { 230,20,420,200 };
    static RECT rect3 = { 450,20,640,200 };
    static INT id = 0;
    static INT timer = 0;
    switch (message)
    {
    case WM_LBUTTONDOWN: {
    }
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_TIMER: 
        {
        HBRUSH hbrGrey = CreateSolidBrush(RGB(169, 169, 169));//grey
        HBRUSH hbrRed = CreateSolidBrush(RGB(255, 0, 0));
        HBRUSH hbrGreen = CreateSolidBrush(RGB(0, 255, 0));
        HBRUSH hbrYellow = CreateSolidBrush(RGB(255, 255, 0));
        switch (timer)
        {
        case 1: {
            FillRect(GetDC(hWnd), &rect1, hbrRed);
            FillRect(GetDC(hWnd), &rect2, hbrGrey);
            FillRect(GetDC(hWnd), &rect3, hbrGrey);
        }break;
        case 2: {
            FillRect(GetDC(hWnd), &rect1, hbrGrey);
            FillRect(GetDC(hWnd), &rect2, hbrYellow);
            FillRect(GetDC(hWnd), &rect3, hbrGrey);
        }break;
        case 3: {
            FillRect(GetDC(hWnd), &rect1, hbrGrey);
            FillRect(GetDC(hWnd), &rect2, hbrGrey);
            FillRect(GetDC(hWnd), &rect3, hbrGreen);
        }break;
        default:
            break;
        }
        if (timer >= 3)
            timer = 0;
        timer++;
        //TCHAR buff[10] = TEXT("");
        //wsprintf(buff, TEXT("%d"), timer++);
        //SetWindowText(hWnd, buff);
        }break;
    case WM_PAINT:
        {
            id = SetTimer(hWnd, TIMERid, 750, NULL);
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            ReleaseDC(hWnd, hdc);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        KillTimer(hWnd, TIMERid);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
READ ALSO
Что означает const*?

Что означает const*?

Именно со звездой - демонические конструкции могут принимать вид

549
Как вызвать функцию как аргумент?

Как вызвать функцию как аргумент?

Смысл такой, что нужно расписать программу для сортировки массива по функциям без использования глобальных переменныхЯ решил пойти путём...

335
как правильно передать массив в функцию?

как правильно передать массив в функцию?

Почему в функцию передается TCHAR(&name)[100], а не TCHAR *name?

369