WM_PAINT на основе нажатия кнопки - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь написать процедуру окна, которая будет вызывать анимацию прямоугольника в окне только при нажатии кнопки «Пуск» и остановку при нажатии кнопки «Стоп».

Я пытался сделать это так:

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_COMMAND:
        switch (wParam)
        {
        case BUTTON_START:
            stopClicked = false;
            DestroyWindow(hStartButton);
            CreateStopButton(hWnd);
            Animate(hWnd);
            return 0;
        case BUTTON_STOP:
            stopClicked = true;
            DestroyWindow(hStopButton);
            CreateStartButton(hWnd);
            return 0;
        }
    case WM_CREATE:
        AddMenus(hWnd);
        CreateStartButton(hWnd);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProcW(hWnd, msg, wParam, lParam);
    }
    return 0;
}

функция Animate:

void Animate(HWND hWnd)
{
    HDC hdcWnd = GetDC(hWnd);

    while(!stopClicked)
    {
        //drawing code
    }
    ReleaseDC(hWnd, hdcWnd);
    DeleteDC(hdcWnd);
}

Программа аварийно завершает работу, поскольку ее никогда не существует, цикл while(!stopClicked).

У меня вопрос, как сделать так, чтобы анимация остановилась при нажатии кнопки?

1 Ответ

0 голосов
/ 01 сентября 2018

Ваше приложение зависло, потому что вы ждете, пока флаг поменяется, и нет способа его изменить.

WindowProcedure вызывается для события, и пока вы не покинете его, любое другое событие не будет обработано.

Что вам нужно сделать, это выполнить шаги анимации по таймеру. Вам нужно установить таймер, который будет отправлять вам событие, которое вы должны обработать, и там вы сможете нарисовать следующий кадр вашей анимации.

...