亲爱的开发者和社区,
我目前正在使用带有 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;