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

时间:2012-07-09 22:02:26

标签: c++ windows if-statement directx

所以我一直试图想出以下几点:

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
    }
}

所以这就是问题所在:在 case WM_PAINT:中,当我取消注释if语句时,由于某种原因,时间停止滴答。我不知道为什么,也不知道如何将它与任何东西联系起来。因此,如果我取消注释它,它将不会呈现,也不会从另一个计时器(有两个计时器)接收信息。请帮助我,如果它很傻,请不要笑。

2 个答案:

答案 0 :(得分:3)

WM_TIMER消息是"低优先级"消息,只有在不需要其他任何事情时才生成它。 WM_PAINT处理程序的问题在于,它在创建窗口后立即生成第一次时不会进行绘制。没有调用EndPaint(),这使得"窗口变脏了#34;状态位已打开。这会立即导致生成另一个WM_PAINT消息。由于重绘并不正确,因此仍然不会画画。 Etcetera,你的应用程序在WM_PAINT消息上刻录100%核心,永远不会空闲,以允许生成WM_TIMER消息。

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

答案 1 :(得分:2)

处理WM_PAINT而不绘制任何内容(假设redraw保持为假),甚至没有调用DefWindowProc是非常不正统的。你的应用程序甚至可能活着而你没有注意到。

来自doc

  

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