InvalidateRect和RedrawWindow之间的区别

Def*_*ult 39 c++ winapi redraw

当我想重绘窗口时,InvalidateRect和RedrawWindow之间是否有任何首选函数?

例如,这两个调用是否相等:(win将是HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);

主要问题:我什么时候应该使用其中一个?背景中是否存在任何差异?(不同的WM_messages /焦点/顺序/优先级..)

我想重绘窗口的原因是因为我向它发送了一个我希望它显示的新图像,这意味着窗口的内容不再有效.

AnT*_*AnT 55

InvalidateRect不会立即重绘窗口.它只是"安排"窗口特定矩形区域的未来重绘.使用InvalidateRect您可以根据需要安排多个区域,使它们在一些内部缓冲区中累积.所有累积的预定区域的实际重绘将在稍后进行,此时窗口没有其他任何操作.(当然,如果在您发出InvalidateRect呼叫时窗口处于空闲状态,则会立即重新绘制).

您还可以通过调用强制立即重绘所有当前累积的无效区域UpdateWindow.但是,再次,如果您不赶时间,UpdateWindow则不必显式调用,因为一旦窗口空闲,它将自动为所有当前无效的区域执行重绘.

RedrawWindow另一方面,它是一个具有更广泛和灵活的功能集的功能.它可以用于执行无效调度(即同样的事情InvalidateRect),或者它可以用于强制执行指定区域的立即重绘,而不进行任何"调度".在后一种情况下,呼叫RedrawWindow实际上等同于呼叫InvalidateRect然后立即呼叫UpdateWindow.

  • 一个重要的注意事项是“RedrawWindow”使您可以控制子项是否无效。`InvalidateRect` 不会给你这个控制权 - 如果你指定了 `WS_CLIPCHILDREN` ,那么它永远不会使子项无效,否则它将使子项无效,但它取决于被无效的确切矩形,并且规则非常模糊。如果您想让您的窗口及其子窗口失效,您需要将“RedrawWindow”与“RDW_ALLCHILDREN”一起使用 - 忘记“InvalidateRect”。 (2认同)

小智 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看起来更干净.