奇怪的if语句导致计时器关闭

weird if statement causing to shut timer

本文关键字:计时器 语句 if      更新时间:2023-10-16

所以我一直在尝试计算以下内容:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;                // Display context handle
    PAINTSTRUCT PaintSt;    // Structure defining area to be drawn
    RECT aRect;             // A working rectangle
    HPEN hPen;              // A working pen
    HBRUSH hBrush;          // A working brush
    switch(message)
    {
        case WM_TIMER:
            switch(wParam)
            {
            case IDT_TIMER1: 
                    redraw = true;
                InvalidateRect(hWnd, NULL, TRUE);
            case IDT_TIMER2:
                if(keys[UP])
            {
                rect2.bottom -= 5;
                rect2.top -= 5;
            }
            if(keys[DOWN])
            {
                rect2.bottom += 5;
                rect2.top += 5;
            }
            if(keys[RIGHT])
            {
                rect2.left += 5;
                rect2.right += 5;
            }
            if(keys[LEFT])
            {
                rect2.left -= 5;
                rect2.right -= 5;
            }
        }
        return 0;
    case WM_PAINT:
            //if(redraw)
            {
                redraw = false;
                render_frame();
            }
        return 0;
    case WM_KEYDOWN:
            switch(wParam)
            {
            case VK_UP:
                keys[UP] = true;
                break;
            case VK_DOWN:
                keys[DOWN] = true;
                break;
            case VK_LEFT:
                keys[LEFT] = true;
                break;
            case VK_RIGHT:
                keys[RIGHT] = true;
                break;
            default:
                break;
            }
        return 0;
    case WM_KEYUP:
        switch(wParam)
        {
        case VK_UP:
            keys[UP] = false;
            break;
        case VK_DOWN:
            keys[DOWN] = false;
            break;
        case VK_LEFT:
            keys[LEFT] = false;
            break;
        case VK_RIGHT:
            keys[RIGHT] = false;
            break;
        default:
                break;
        }
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);    // default message processing
    }
}

所以问题来了:在的情况下,WM_PAINT:,当我取消对if语句的注释时,由于某种原因,时间停止了计时。我不知道为什么,也不知道如何将其与任何事情联系起来。因此,如果我取消注释它,它将不会渲染,也不会从另一个计时器(有两个计时器)接收信息。请帮帮我,如果这很傻,请不要笑。

WM_TIMER消息是一条"低优先级"消息,只有在不需要执行其他操作时才会生成。WM_PAINT处理程序的问题在于,它不会在第一次生成时绘制,也就是在创建窗口后立即绘制。EndPaint()未被调用,这会使"window is dirty"状态位处于打开状态。这会立即导致生成另一条WM_PAINT消息。这仍然无法绘制,因为重绘不是真的。等等,你的应用程序在WM_PAINT消息上燃烧100%的核心,并且永远不会空闲到足以生成WM_TIMER消息。

只需删除重绘测试即可解决问题。总是在Windows要求时绘制。或者将消息传递给DefWindowProc()。

在不绘制任何内容的情况下处理WM_PAINT(假设redraw为false),甚至不调用DefWindowProc都是非常不正统的。你的应用程序甚至可能在你没有注意到的情况下仍然存在。

来自文档:

应用程序必须调用BeginPaint和EndPaint以响应WM_PAINT消息,或将消息传递给DefWindowProc函数以验证窗口。DefWindowProc验证更新区域;它如果窗口后台需要,可以发送WM_ERASEBKGND消息被擦除。