DoEvents等效于C ++?

时间:2009-09-12 13:17:32

标签: c++ windows winapi

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

2 个答案:

答案 0 :(得分:16)

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 :(得分:2)

我在Win32 API中有点生疏,但执行此操作的异步方式是:

  • 使rect失效
  • 设置定时器(见下文)以在50ms后发送消息
  • 返回事件循环以发生WM_PAINT事件
  • 收到定时器信息后,移动矩形,然后重复

这种方式与事件驱动很好地集成。我意识到这不是你要求的,但我认为无论如何我都会提到它作为一种可能的解决方案:)

编辑:快速谷歌调出Windows API调用[SetTimer](http://msdn.microsoft.com/en-us/library/ms644906(VS.85,loband).aspx),你可以使用它来促进这个。消息将是一个WM_TIMER。