亲爱的开发者和社区,
我目前正在使用带有GUI的Win32 API进行Snake游戏。
我正在WM_PAINT消息中的WndProc()函数中绘制Snake,然后我创建绘制上下文并绘制矩形。
但问题是Snake正在移动,绘制的矩形不再消失。所以我在WndProc()中调用了函数InvalidateRect()来更新我的Window。那是在工作但是经过42步与蛇一起,窗口变成白色,有时按钮(最小化,最大化,......)
然后我使用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;