与 3D 应用程序中的 Windows 消息循环相关的错误时间?
Posted
技术标签:
【中文标题】与 3D 应用程序中的 Windows 消息循环相关的错误时间?【英文标题】:Wrong Timing relative to Windows Message Loop in 3D appli? 【发布时间】:2015-03-12 23:10:16 【问题描述】:关于 Windows 消息循环,我可能有一个 Pb,我认为 (?):
在为 Windows 操作 (OpenGL + C++) 下绘制的 3D 场景时,我希望响应 WM_ LBUTTONDOWN 用户事件,将相机位置从 A 点连续更改到 B 点(但具有相同的外观点) .我还希望该动作的持续时间约为 2 秒:
在我的 WM_LBUTTONDOWN 消息的 OnLButtonDown() 处理程序中,我输入了一个 100 次迭代循环,如下所示:
m_camera.setEyePos(...pos #i...);
SendMessage(m_hWnd, WM_PAINT,0,0);
在所需的相机位置结束。
但我的场景在 99 个中间状态中根本没有重绘: 它只是在最终位置重新绘制! (但以正确的方式) 它直接从最初的角度跳到最后的角度! (但这样做需要 2 秒,正如预期的那样..)
怎么了? 你能帮我吗?谢谢。
附:对不起我的英语(我是法国人..)......以及 Windows 编程的初学者......
【问题讨论】:
什么是Pb
?唯一想到的就是铅。
【参考方案1】:
这种方法存在问题。如果您在循环中迭代 100 次,那么您没有处理 Windows 消息。因此,在您离开循环之前,您不会处理 WM_PAINT。然后是 WM_PAINT 有一个与之关联的剪辑区域的问题,只有操作系统知道,所以自己发送消息永远是无效的。相反,调用 InvalidateRect 请求操作系统生成 WM_PAINT。您应该通过计时器或游戏循环执行此操作,以便继续处理消息。
【讨论】:
@ScottMc ,好的,但我试过了: InvalidateRect(m_hWnd,NULL,true);更新窗口(m_hWnd)==0);在我的循环中,但它没有改变任何东西..???我不明白。 与之前相同:当您在循环中时,不会处理 WM_PAINT。 Windows 不会中断您的循环。它仅在您的应用等待消息时发送消息。 你的意思是我不能从我的循环内重新绘制,即使使用 InvalidateRect?在那种情况下,我该怎么办?... 你可以在你的循环中绘画。但不是通过生成 WM_PAINT。只需调用 GetDC 并使用该 DC 进行绘制。 它也不适用于这个 i-loop ...m_Camera.Set EyePos(... pos #i ...) UpdateWindow(m_hWnd); hDC = GetDC(m_hWnd); OnPaint(hDC);释放DC(m_hWnd,hDC);但是现在经过精确测试,我确信我通常的 Onpaint() 处理程序确实执行了 100 次!!!但没有发生中间重绘! ???疯狂!这个 OnPaint() 处理程序与我用于处理 WM_PAINT 消息的处理程序相同: case WM_PAINT: hDC = BeginPaint(hWnd, &ps); OnPaint(hDC); EndPaint(hWnd, &ps);休息;以上是关于与 3D 应用程序中的 Windows 消息循环相关的错误时间?的主要内容,如果未能解决你的问题,请参考以下文章