首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++的DoEvents等价物?

C++的DoEvents等价物?
EN

Stack Overflow用户
提问于 2009-09-12 13:17:32
回答 2查看 12.4K关注 0票数 6

我不熟悉原生c++。现在,当我按下鼠标左键时,它有一个InvalidateRect循环,它执行InvalidateRect并绘制一个矩形,并在每次迭代时按框的大小递增X。但是,C++在绘图方面比C#快得多,效率也高得多,以至于它可以立即绘制所有这些内容。我想要的是使矩形无效,显示矩形,等待50ms,然后继续循环。我尝试了Sleep(50),但它仍然要等到绘画完成后才会显示结果。我也尝试过PeekMessage,但它没有改变任何东西。任何帮助都将不胜感激。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-12 13:20:27

DoEvents基本上翻译为:

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 17
EN

Stack Overflow用户

发布于 2009-09-12 13:27:39

我对Win32应用程序接口有点生疏,但是异步的方式是:

  • 使rect无效
  • 设置计时器以在50ms后发送消息
  • 返回到事件循环以让WM_PAINT事件发生
  • 收到计时器消息时,移动rect,然后重复

F29

这种方式很好地与事件驱动相结合。我知道这并不完全是您所要求的,但我想我还是把它作为一种可能的解决方案提出来:)

编辑:快速google会打开Windows API调用[ SetTimer](http://msdn.microsoft.com/en-us/library/ms644906(VS.85,loband%29.aspx%29),您可以使用它来简化这一过程。消息将是WM_TIMER消息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1415095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档