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()

C#之Application.DoEvents()

WPF 中的 Application.DoEvents() 在哪里?

vb中的DoEvents是干啥用的?

与 Application.DoEvents() 和 PictureBox 混淆 [重复]