DoEvents 等效于 C++?
Posted
技术标签:
【中文标题】DoEvents 等效于 C++?【英文标题】:DoEvents equivalent for C++? 【发布时间】:2009-09-12 13:17:31 【问题描述】:我是原生 C++ 的新手。现在,我做到了,所以当我按下鼠标左键时,它有一个 for 循环,它执行 InvalidateRect 并绘制一个矩形,并在每次迭代时将 X 增加框大小。但是,C++ 在绘图方面比 C# 更快、更高效,它可以立即绘制所有这些。我想要的是它使矩形无效,显示矩形,等待 50 毫秒,然后继续循环。我尝试了 Sleep(50) ,但它仍然等到绘画完成后再显示结果。我也试过 PeekMessage 但它没有改变任何东西。 任何帮助,将不胜感激。谢谢
【问题讨论】:
【参考方案1】:DoEvents 基本上翻译为:
void DoEvents()
MSG msg;
BOOL result;
while ( ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE ) )
result = ::GetMessage(&msg, NULL, 0, 0);
if (result == 0) // WM_QUIT
::PostQuitMessage(msg.wParam);
break;
else if (result == -1)
// Handle errors/exit application, etc.
else
::TranslateMessage(&msg);
:: DispatchMessage(&msg);
【讨论】:
+1,几乎正确,只是没有检查GetMessage的返回值,没有正确处理WM_QUIT。 如果 GetMessage 返回 0,则需要重新发布 WM_QUIT 消息(blogs.msdn.com/oldnewthing/archive/2005/02/22/378018.aspx)。 GetMessage 也可以返回-1,应该处理。 @FilipNavara 我原本打算只展示基础知识,但您说的完全正确 - 已编辑以展示所有 3 种可能的情况。 @FilipNavara 话虽这么说,Application.DoEvents
实际上更接近我原来的...它应该这样做,但它没有...【参考方案2】:
我对 Win32 API 有点生疏,但是异步的方式是:
使矩形无效 设置定时器(见下文)在 50 毫秒后发送消息 返回事件循环让 WM_PAINT 事件发生 收到定时器消息后,移动矩形,然后重复这种方式与事件驱动很好地集成在一起。我意识到这并不是你所要求的,但我想我还是会提到它作为一种可能的解决方案:)
编辑:快速谷歌打开 Windows API 调用 [SetTimer](http://msdn.microsoft.com/en-us/library/ms644906(VS.85,loband).aspx),您可以使用它来促进这一点。消息将是 WM_TIMER 消息。
【讨论】:
以上是关于DoEvents 等效于 C++?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 性能分析:Application.DoEvents()
什么相当于 WPF 应用程序中的 Application.DoEvents()