所以我一直试图想出以下几点:
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语句时,由于某种原因,时间停止滴答。我不知道为什么,也不知道如何将它与任何东西联系起来。因此,如果我取消注释它,它将不会呈现,也不会从另一个计时器(有两个计时器)接收信息。请帮助我,如果它很傻,请不要笑。
答案 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消息 被删除。