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