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

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

主要问题:我什么时候应该使用一个或另一个?后台有什么区别吗? (不同的WM_messages/focus/order/priority ..)

我想重新绘制窗口的原因是因为我向其发送了要显示的新图像,这意味着窗口的内容不再有效。

最佳答案

InvalidateRect不会立即重绘窗口。它只是“计划”将来重绘窗口的特定矩形区域。使用InvalidateRect,您可以调度所需的任意多个区域,使它们堆积在某些内部缓冲区中。当窗口无其他操作时,将在以后进行所有累计计划区域的实际重绘。 (当然,如果在发出InvalidateRect调用时窗口处于空闲状态,则将立即进行重绘)。

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

另一方面,RedrawWindow是一种功能更广泛,更灵活的函数。它可以用于执行无效调度(即InvalidateRect所做的相同操作),也可以用于强制执行指定区域的立即重绘,而无需执行任何"dispatch"。在后一种情况下,调用RedrawWindow实际上等效于调用InvalidateRect然后立即调用UpdateWindow

关于c++ - InvalidateRect和RedrawWindow之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2325894/

10-12 12:53