@anonymouss

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

Начинаю знакомство с WinAPI нужно сделать что-то типа светофора(три серых квадрата и по очередности один из них должен менять цвет) незнаю какое условие сделать поможет кто разобраться?
Понимаю что в WM_TIMER нужно вставить то что в WM_PAINT, но как усвовие прописать - хз
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;
}
  • Вопрос задан
  • 1601 просмотр
Решения вопроса 1
@anonymouss Автор вопроса
Решил проблему так
если у кого есть другие варианты - пишите
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;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
незнаю какое условие сделать поможет кто разобраться?

Конечный автомат тебе поможет. См.

И, кстати, в WM_PAINT BeginPaing потерял.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы