0

所以我一直试图弄清楚以下几点:

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 语句时,时间由于某种原因停止计时。我不知道为什么,也不知道如何将这与任何事情联系起来。因此,如果我取消注释它,它将不会呈现,也不会从另一个计时器(有两个计时器)接收信息。请帮助我,如果它很傻,请不要笑。

4

2 回答 2

3

WM_TIMER 消息是“低优先级”消息,它仅在不需要执行其他任何操作时生成。您的 WM_PAINT 处理程序的问题在于它不会在第一次生成时绘制,而是在创建窗口后立即绘制。未调用 EndPaint(),这使“窗口脏”状态位处于打开状态。这会立即导致生成另一个 WM_PAINT 消息。仍然不会绘制,因为重绘不是真的。等等,您的应用程序正在 WM_PAINT 消息上消耗 100% 的核心,并且永远不会空闲到足以允许生成 WM_TIMER 消息。

只需删除重绘测试即可解决您的问题。当 Windows 要求时,请始终绘制。或者将消息传递给 DefWindowProc()。

于 2012-07-09T22:30:24.867 回答
2

WM_PAINT不绘制任何东西(假设redraw保持错误),甚至不调用的处理DefWindowProc是非常不正统的。你的应用程序甚至可能在你不注意的情况下还活着。

文档

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

于 2012-07-09T22:17:01.633 回答