C ++ | Win32 API |被困白色的屏幕| InvalidateRect()

时间:2018-04-28 13:43:22

标签: c++ winapi win32gui wm-paint

亲爱的开发者和社区,

我目前正在使用带有GUI的Win32 API进行Snake游戏。

我正在WM_PAINT消息中的WndProc()函数中绘制Snake,然后我创建绘制上下文并绘制矩形。

但问题是Snake正在移动,绘制的矩形不再消失。所以我在WndProc()中调用了函数InvalidateRect()来更新我的Window。那是在工作但是经过42步与蛇一起,窗口变成白色,有时按钮(最小化,最大化,......)

Here is the Picture

然后我使用CreateTimerQueueTimer()将InvalidRect()调用放在TimerRoutine中。这个问题似乎已经解决了,但经过几分钟后它又重新出现了。 这是代码:

VOID CALLBACK TimerRoutine(HWND lpParam, BOOLEAN TimerOrWaitFired)
{
    BoardEditing();
    InvalidateRect(lpParam, NULL, TRUE);
}

... 在Main:

CreateTimerQueueTimer(&hTimer, hTimerQueue, (WAITORTIMERCALLBACK)TimerRoutine, hWnd, 0, 100, 0);

... 在WndProc()中:

switch (message)
{
case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    if (GameOver == 1) {
        TextOut(hdc, 100, 100, gameover, _tcslen(gameover));
    }
    else {
        HBRUSH brushrot = CreateSolidBrush(RGB(255, 0, 0));
        HBRUSH brushgruen = CreateSolidBrush(RGB(0, 255, 0));
        HBRUSH brushschwarz = CreateSolidBrush(RGB(0, 0, 0));

        for (int y = 0; y < Board_Y; y++) {
            for (int x = 0; x < Board_X; x++) {

                RECT rect = { x * 30,y * 30,x * 30 + 29,y * 30 + 29 };
                if (Board[y][x] == 1) {
                    FillRect(hdc, &rect, brushrot);
                }
                else if (Board[y][x] == 2) {

                    FillRect(hdc, &rect, brushgruen);
                }
            }
        }
    }

    EndPaint(hWnd, &ps);

    break;

0 个答案:

没有答案