DoEvents等效于C++?

jma*_*erx 6 c++ windows winapi

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

Ree*_*sey 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1,几乎正确,除了没有检查GetMessage的返回值并且没有正确处理WM_QUIT. (3认同)
  • 如果GetMessage返回0,则需要重新发布WM_QUIT消息(http://blogs.msdn.com/oldnewthing/archive/2005/02/22/378018.aspx).GetMessage也可以返回-1,应该处理. (2认同)