【问题标题】:WM_PAINT based on button clickWM_PAINT 基于按钮点击
【发布时间】:2018-09-01 14:26:13
【问题描述】:

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

我试过这样做:

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

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

【问题讨论】:

    标签: c++ winapi wndproc


    【解决方案1】:

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

    WindowProcedure 在一个事件上被调用,直到你离开它,任何其他事件都不会被处理。

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

    【讨论】:

    • 在您离开之前,不会处理任何其他事件。 - 这不完全是。当然,新事件将独立于是否离开我们的窗口进程而生成。但是如何调用 windowproc 呢?为此,我们需要调用几个 user32 api,其中 windows 调用 windowproc 作为回调。通常这是 GetMessage 调用 - 正是在此调用 windowproc 内调用。但不仅如此。例如,当我们在 windowproc 中调用 DestroyWindow 时 - 它将被递归调用,使用 WM_DESTROYWM_NCDESTROY 等,但在 绘图代码 内部不会调用泵消息。
    • @RbMm:你是对的。我的回答被简化为对 OP 来说更清楚,所以他可以对 WinApi 了解更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2011-10-17
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多