0

亲爱的开发者和社区,

我目前正在使用带有 GUI 的 Win32 API 开发蛇游戏。

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

但问题是 Snake 正在移动,并且绘制的 Rectangles 不再消失。所以我在 WndProc() 中调用了函数 InvalidateRect() 来更新我的窗口。这是可行的,但是在蛇走了 42 步之后,窗口变成了白色,有时按钮(最小化,最大化,...)也

这是图片

然后我将 InvalidRect() 调用与 CreateTimerQueueTimer() 一起放入 TimerRoutine。问题似乎解决了,但几分钟后又出现了。这是代码:

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

...在主要:

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;
4

0 回答 0