WM_PAINT на основе нажатия кнопки
Я пытаюсь написать процедуру окна, которая будет вызывать анимацию прямоугольника в окне только при нажатии кнопки "Пуск" и остановку при нажатии кнопки "Стоп".
Я пытался сделать это так:
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 ответ
Ваше приложение зависло, потому что вы ждете, когда флаг поменяется, и нет способа его изменить.
WindowProcedure
вызывается для события, и пока вы не покинете его, любое другое событие не будет обработано.
Что вам нужно сделать, это выполнить шаги анимации по таймеру. Вам нужно установить таймер, который будет отправлять вам событие, которое вы должны обработать, и там вы сможете нарисовать следующий кадр вашей анимации.