相当于C ++的DoEvents?

我是新来的本地c + +。 现在,当我按下鼠标左键的时候,就做到了这一点,它有一个for循环,它执行InvalidateRect并绘制一个矩形,并且每次迭代时按照框的大小递增X. 但是,C ++在绘图上比C#快得多,效率也高于C#,所以它立即得到了这一切。 我想让它无效矩形,显示矩形,等待50ms,然后继续循环。 我尝试了睡眠(50),但仍然等待,直到绘画完成,然后显示结果。 我也试过PeekMessage,但没有改变任何东西。 任何帮助,将不胜感激。 谢谢

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); } } } 

我在Win32 API中有点生疏,但是这样做的异步方式是:

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

这种方式很好地融入事件驱动。 我意识到这不完全是你要求的,但我想我会提到它作为一个可能的解决方案无论如何:)

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