Sleep()不';你不能在winapi32中工作吗? 我仍然是使用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);

Sleep()不';你不能在winapi32中工作吗? 我仍然是使用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);,c++,winapi,visual-c++-2008,C++,Winapi,Visual C++ 2008,我使用Invalidate来重新绘制窗口的一部分,我正在尝试的是每隔1秒左右重新绘制一次窗口,以使更改对用户的眼睛显而易见。奇怪的是,如果没有MessageBox命令,Sleep似乎不会影响我的窗口,而事实上,我不希望每次重新绘制都使用MessageBox命令,因为这太麻烦了 我已经试过10002000次了,甚至是10000次。 windoes确实在睡眠时冻结了,但明显的重新绘制只在最后一个睡眠命令中进行了1次 这段代码是void a()的一部分。void A()由void B()调用 我能做些

我使用Invalidate来重新绘制窗口的一部分,我正在尝试的是每隔1秒左右重新绘制一次窗口,以使更改对用户的眼睛显而易见。奇怪的是,如果没有MessageBox命令,Sleep似乎不会影响我的窗口,而事实上,我不希望每次重新绘制都使用MessageBox命令,因为这太麻烦了

我已经试过10002000次了,甚至是10000次。 windoes确实在睡眠时冻结了,但明显的重新绘制只在最后一个睡眠命令中进行了1次

这段代码是void a()的一部分。void A()由void B()调用

我能做些什么来解决这个问题

哦,是的,我用VisualC++ 2008的方式用< < /P> >


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

重要的是,
不会画任何东西。它只安排要绘制的窗口内容(将
WM_PAINT
消息排入消息队列)。直到您返回到消息循环并且窗口实际开始处理绘制消息,实际绘制才会发生。因此,在上次睡眠/消息框之后,您最终从函数返回,再次到达消息循环,在消息循环中,您最终获得表示实际绘制事件的
WM_PAINT
消息,并处理此消息以重新绘制窗口内容。

您尝试了
delay
的值是多少?1000,2000,如果没有MessageBox命令,即使10000也不会产生任何效果。。。我所说的“无效果”是:假设有3个重新绘制命令,每个命令后面都有3个睡眠命令,窗口只是冻结了3倍的延迟,而重新绘制在最后一个命令中只完成了1倍……但是如果我也为每个睡眠命令添加MessageBox命令,很明显,windows确实重新绘制了3次…有什么帮助吗?这在windows GUI编程中非常重要。直到您泵送消息循环,才会出现绘制。把键盘收起来读一本书。你把代码放在哪里了?如果它是在处理程序中由窗口重绘间接执行的,则它可能会进入一个循环,在该循环中,每次重画启动时都会存储新的重绘事件。@Hans Passant:我确实使用了消息循环。重新绘制确实发生了,但它显然只在最后一个sleep命令中完成了1x,虽然我调用了2次,但当我将sleep放在第一行WM_PAINT case中时,为什么程序的行为看起来是一样的?我的意思是,我只能看到最后一次重新粉刷,尽管它被称为无数次。提前感谢:)@zia The
invalidate
仅计划要绘制的窗口(告诉Win32,此窗口的内容无效)。实际上,当窗口应该做更重要的事情时,paint事件的优先级很低,不能垃圾邮件重画事件。而且Win32足够智能,只需将一条绘画消息放入消息队列。因此,当您调用
invalidate
并在消息队列中已经有一个
WM_PAINT
时,Win32会将此请求与前一个请求合并(将矩形合并为一个可能更大的包含这两者的矩形),因此在您处理它之前,始终只有一个绘制事件。
       //Message loop
       if(turn == 0)
       {
       B();
       }