zia*_*zia 2 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);
Run Code Online (Sandbox Code Playgroud)
我使用Invalidaterect重新绘制我的一部分窗口,我想要做的是每隔1秒左右重新绘制一次窗口,以使用户的眼睛看到明显的变化.奇怪的是,Sleep似乎不会影响我的窗口,如果它没有跟随MessageBox命令,而实际上我不希望每次重新绘制都有任何MessageBox命令,因为它太令人不安了.
我已经尝试了1000,2000甚至10000的延迟.随着睡眠,风暴确实冻结了,但是在最后一次睡眠命令中,表面重新粉刷只进行了1次......
此代码是void A()的一部分.void void()由void B()调用.
//Message loop
if(turn == 0)
{
B();
}
Run Code Online (Sandbox Code Playgroud)
我有什么办法可以解决这个问题吗?
哦,是的,我顺便使用MS Visual C++ 2008 Express
在此事先感谢您对此事的任何帮助:)
重要的是,这InvalidateRect没有任何吸引力.它仅调度要绘制的窗口内容(将WM_PAINT消息排入消息队列).在您返回到消息循环并且窗口实际上处理绘制消息之前,实际绘图不会发生.因此,在最后一个Sleep/MessageBox之后,您最终从函数返回以再次到达消息循环,并在消息循环中最终获得WM_PAINT表示实际绘制事件的消息并处理此消息以重绘窗口的内容.