当我想重绘窗口时,InvalidateRect和RedrawWindow之间是否有任何首选函数?
例如,这两个呼叫是否相等:(胜利将是HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);
主要问题:我什么时候应该使用其中一个?背景中是否存在任何差异? (不同的WM_messages /焦点/顺序/优先级..)
我想重绘窗口的原因是因为我向它发送了一个我希望它显示的新图像,这意味着窗口的内容不再有效。
答案 0 :(得分:51)
InvalidateRect
不会立即重绘窗口。它只是“安排”窗口特定矩形区域的未来重绘。使用InvalidateRect
,您可以根据需要安排任意数量的区域,使其累积在某个内部缓冲区中。所有累积的预定区域的实际重绘将在稍后进行,此时窗口没有其他任何操作。 (当然,如果在您发出InvalidateRect
电话时窗口处于空闲状态,则会立即重新绘制)。
您还可以通过调用UpdateWindow
强制立即重绘所有当前累积的无效区域。但是,再次,如果您不赶时间,则无需显式调用UpdateWindow
,因为一旦窗口处于空闲状态,它将自动为所有当前无效的区域执行重绘。
RedrawWindow
是一个具有更广泛和灵活的功能集的函数。它可以用于执行无效调度(即InvalidateRect
做同样的事情),或者它可以用于强制执行指定区域的立即重绘,而不进行任何“调度”。在后一种情况下,调用RedrawWindow
实际上等同于调用InvalidateRect
,然后立即调用UpdateWindow
。
答案 1 :(得分:19)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
和InvalidateRect(win, NULL, NULL);
是等效的。这两个函数使窗口无效。 WM_PAINT
在正常时间发生(在应用程序队列中没有其他消息)。
如果您希望立即完成绘画,那么拨打RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)
或InvalidateRect
后跟UpdateWindow
即可。
RedrawWindow
只是为RDW_ *位提供了更多选项。如果您想要的是在没有立即绘画的情况下使窗口无效,则调用InvalidateRect
似乎更清晰。
答案 2 :(得分:1)
我不喜欢只提供链接,但MSDN会为您提供所需的所有信息,在此处重新输入所有信息将是浪费时间。
简而言之,是的,存在分歧。问题是,为什么要重绘窗口?是因为内容不再有效吗?如果是,请使用InvalidateRect
,否则请使用RedrawWindow
。
答案 3 :(得分:1)
RedrawWindow立即重新绘制窗口。 InvalidateRect仅标记要在下一个WM_PAINT消息上重新绘制的窗口。但WM_PAINT消息的优先级低于其他消息,因此如果您的应用正忙于处理其他消息,则不会立即重新绘制。