我仍然是使用 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/