c++ - InvalidateRect 和 RedrawWindow 的区别

标签 c++ winapi redraw

当我想重绘一个窗口时,在 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/

相关文章:

c++ - 使用 Win32 的带有主题的透明单选按钮控件

php - 允许用户设置个人资料默认照片的常用方法是什么?

c++ - 为什么我的编辑控件会忽略应用的视觉样式?

c++ - 我的第一个 CPP 程序的问题 - 标题和源代码

c++ - 如何从文件名中找到哪个进程对文件有句柄

swift - 如何将 UIView 子类化并在其中添加另一个具有相同框架的 UIView

c# - WPF强制重绘 Canvas

c++ - 从具有多列整数的文件中读取并将它们放入数组中

c++ - 我在哪里可以找到用 : boost + protobuf 实现的 RPC