c++ - Sleep() 在 winapi32 中不起作用?

标签 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的延迟。 windows 确实因 sleep 而卡住,但在最后一个 sleep 命令中,明显的重新绘制仅完成了 1 次...

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

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

有什么替代方法可以解决这个问题吗?

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

预先感谢您就此事提供的任何帮助:)

最佳答案

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

关于c++ - Sleep() 在 winapi32 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7290462/

相关文章:

windows - GetFinalPathNameByHandle 对于设备句柄失败

winapi - 使用对 GlobalLock()\GlobalUnlock() 的正确方法是什么?

c++ - 如何让 __declspec(thread) 在 Windows CE 上工作

c# - 我可以控制分配给互操作程序集的版本号吗?

c++ - 在 Visual Studio 2012 中使用 Gstreamer

c++ - 使用qmake构建项目时出现"Unsupported Build Type"

c++ - 将外部库添加到 Qt Creator 项目中

c++ - 将复制返回的值分配给引用

c++ - 无法获取当前键盘布局

c++ - 如何使用附加库编译 Visual C++ 程序