Sleep()在winapi32中不起作用?

时间:2011-09-03 00:52:10

标签: c++ winapi visual-c++-2008

我仍然是使用c ++ winapi32编程GUI的初学者,我发现了一些奇怪的东西。 这是我的代码的一部分:

        InvalidateRect(hwnd,&rect, true);
        //Sleep(delay);
        MessageBox(hwnd, "Blahblah!", "blahblah",MB_OK | MB_ICONINFORMATION);
        InvalidateRect(hwnd,&rect, true);
        //Sleep(delay);
        MessageBox(hwnd, "Blahblah!", "blahblah",MB_OK | MB_ICONINFORMATION);

我使用Invalidaterect重新绘制我的一部分窗口,而我正在尝试做的是每1秒左右重新绘制一次窗口,以使用户的眼睛看到明显的变化。奇怪的是,Sleep似乎不会影响我的窗口,如果它没有跟随MessageBox命令,而实际上我不希望每次重新绘制都有任何MessageBox命令,因为它太令人不安了。

我已尝试1000,2000,甚至10000延迟。 风暴确实在睡眠时冻结了,但是在最后一次睡眠命令中,表面重新涂抹只进行了1次......

此代码是void A()的一部分。而void A()由void B()调用。

       //Message loop
       if(turn == 0)
       {
       B();
       }           

我有什么办法可以解决这个问题吗?

哦,是的,我顺便使用MS Visual C ++ 2008 Express

提前感谢您对此事的任何帮助:)

1 个答案:

答案 0 :(得分:6)

重要的是,InvalidateRect没有画任何东西。它仅调度要绘制的窗口内容(将WM_PAINT消息排入消息队列中)。在您返回到消息循环并且窗口实际上处理绘制消息之前,实际绘图不会发生。因此,在最后一个Sleep / MessageBox之后,您最终从函数返回以再次到达消息循环,并在消息循环中最终获得表示实际绘制事件的WM_PAINT消息并处理此消息以重绘窗口的内容