当我想重绘一个窗口时,在 InvalidateRect 和 RedrawWindow 之间有什么首选的函数可以调用吗?
例如,这两个调用是否相等:(win 将是 HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);<br/>
InvalidateRect(win, NULL, NULL);
主要问题:我什么时候应该使用其中一个?背景中是否存在任何差异? (不同的 WM_messages/焦点/顺序/优先级..)
我想重绘窗口的原因是因为我向它发送了一个我希望它显示的新图像,这意味着窗口的内容不再有效。
最佳答案
InvalidateRect
不会立即重绘窗口。它只是为窗口的特定矩形区域“安排” future 重绘。使用 InvalidateRect
您可以根据需要安排尽可能多的区域,使它们累积在一些内部缓冲区中。所有累积的预定区域的实际重绘将在稍后进行,此时窗口无事可做。 (当然,如果在您发出 InvalidateRect
调用时窗口处于空闲状态,则会立即进行重绘)。
您还可以通过调用 UpdateWindow
来强制立即重绘所有当前累积的无效区域。但是,同样,如果您不着急,则不需要显式调用 UpdateWindow
,因为一旦窗口空闲,它将自动对所有当前无效的区域执行重绘。
RedrawWindow
是一个具有更广泛和灵活的功能集的函数。它可用于执行失效调度(即 InvalidateRect
所做的相同的事情),也可用于强制执行指定区域的立即重绘,而不进行任何"dispatch"。在后一种情况下,调用 RedrawWindow
实际上等同于调用 InvalidateRect
然后立即调用 UpdateWindow
。
关于c++ - InvalidateRect 和 RedrawWindow 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325894/