【问题标题】:Difference between InvalidateRect and RedrawWindowInvalidateRect 和 RedrawWindow 的区别
【发布时间】:2011-01-20 12:27:47
【问题描述】:

当我想重绘一个窗口时,在 InvalidateRect 和 RedrawWindow 之间有什么首选的函数可以调用吗?

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

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

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

【问题讨论】:

标签: c++ winapi redraw


【解决方案1】:

InvalidateRect 不会立即重绘窗口。它只是为窗口的特定矩形区域“安排”未来重绘。使用InvalidateRect,您可以根据需要安排尽可能多的区域,使它们累积在一些内部缓冲区中。所有累积的计划区域的实际重绘将在稍后进行,此时窗口无事可做。 (当然,如果在您发出InvalidateRect 调用时窗口处于空闲状态,则会立即进行重绘)。

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

另一方面,RedrawWindow 是一个具有更广泛和灵活的功能集的函数。它可用于执行失效调度(即InvalidateRect 所做的相同的事情),也可用于强制执行指定区域的立即重绘,而不进行任何“调度”。在后一种情况下,调用RedrawWindow 几乎等同于调用InvalidateRect,然后立即调用UpdateWindow

【讨论】:

  • 一个重要的提示是RedrawWindow 让您可以控制孩子是否无效。 InvalidateRect 不给你这个控制 - 如果你有 WS_CLIPCHILDREN 指定,那么它永远不会使孩子无效,否则它将使孩子无效,但这取决于被无效的确切矩形,并且规则非常模糊。如果你想让你的窗口和它的孩子一起失效,你会想要使用RedrawWindowRDW_ALLCHILDREN - 忘记InvalidateRect
【解决方案2】:

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 似乎更干净。

【讨论】:

    【解决方案3】:

    我不喜欢只提供链接,但 MSDN 会为您提供所需的所有信息,在这里重新输入所有信息会浪费时间。

    RedrawWindow

    InvalidateRect

    简而言之,是的,存在差异。问题是,为什么要重绘窗口?是因为内容不再有效吗?如果是,使用InvalidateRect,否则使用RedrawWindow

    【讨论】:

    • 我去过 MSDN 并检查了这些功能,但我得出的结论是,它们最终通过使矩形无效来向窗口发送 WM_PAINT。对您的问题的回答是是的,内容无效(这是桌面的图像)。我以恒定速率将图像发送到窗口,然后将 InvalidateRect 发送到窗口以便更新 - 请问还有什么原因?
    • other 的原因是什么?
    【解决方案4】:

    RedrawWindow 立即重新绘制窗口。 InvalidateRect 仅标记要在下一个 WM_PAINT 消息上重新绘制的窗口。但是 WM_PAINT 消息的优先级低于其他消息,因此如果您的应用正忙于处理其他消息,则不会立即重新绘制。

    【讨论】:

    • 可能值得注意的是,所有“重绘”都需要WM_PAINT 消息。没有办法解决它。 RedrawWindow 还会向您的窗口发送WM_PAINT。不同之处在于RedrawWindow 会以立即处理的方式发送。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    相关资源
    最近更新 更多