WM_PAINT 基于按钮点击

WM_PAINT based on button click

我正在尝试编写一个 window 程序,仅在单击开始按钮时调用 window 中的矩形动画,并在单击停止按钮时停止。

我试过这样做:

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) 循环。

我的问题是如何使动画在单击按钮时停止?

您的应用程序已挂起,因为您正在等待标志更改,但它不可能更改。

WindowProcedure 在事件上被调用,在您离开之前,不会处理任何其他事件。

您需要做的是在计时器上执行动画步骤。 您需要设置一个计时器,它会向您发送一个您必须处理的事件,您可以在那里绘制动画的下一帧。