C++ 竖立窗口和重画窗口之间的差异

C++ 竖立窗口和重画窗口之间的差异,c++,winapi,redraw,C++,Winapi,Redraw,当我想重画一个窗口时,在Invalidate和RedrawWindow之间是否有任何首选函数可以调用 例如,这两个调用是否相等:(win将是HWND) 重画窗口(win、NULL、NULL、RDW\u INVALIDATE) 无效(赢、空、空) 主要问题:何时使用其中一种?背景有什么不同吗?(不同的WMU消息/焦点/顺序/优先级…) 我想重新绘制窗口的原因是,我向它发送了一个新图像,希望它显示,这意味着窗口的内容不再有效。我不喜欢只提供链接,但MSDN会提供您需要的所有信息,在这里重新键入这些信

当我想重画一个窗口时,在Invalidate和RedrawWindow之间是否有任何首选函数可以调用

例如,这两个调用是否相等:(win将是HWND)
重画窗口(win、NULL、NULL、RDW\u INVALIDATE)
无效(赢、空、空)

主要问题:何时使用其中一种?背景有什么不同吗?(不同的WMU消息/焦点/顺序/优先级…)


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

我不喜欢只提供链接,但MSDN会提供您需要的所有信息,在这里重新键入这些信息将是浪费时间


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

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

invalidate
不会立即重新绘制窗口。它只是为窗口的特定矩形区域“安排”未来的重画。使用
invalidate
可以安排任意数量的区域,使它们累积在一些内部缓冲区中。所有累计计划区域的实际重画将在稍后窗口无其他事情可做时进行。(当然,如果在发出
invalidate
调用时窗口处于空闲状态,则会立即重新绘制)

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

另一方面,
重画窗口
是一个功能范围更广、功能更灵活的函数。它可用于执行无效调度(即与
无效设置
所做的相同),也可用于强制执行指定区域的立即重画,而无需执行任何“调度”。在后一种情况下,调用
重画窗口
实际上相当于调用
无效设置
,然后立即调用
更新窗口

重画窗口(win、NULL、NULL、RDW\u INVALIDATE)
无效(赢、空、空)是等效的。这两个函数都使窗口无效。在这两种情况下,
WM_PAINT
都在正常时间发生(应用程序队列中没有其他消息)

如果希望立即完成绘制,则调用
重画窗口(win、NULL、NULL、RDW_INVALIDATE | RDW_UPDATENOW)
INVALIDATE
后接
UpdateWindow
即可


重画窗口
简单地提供了更多关于RDW_*位的选项。如果您只想在没有立即绘制的情况下使窗口无效,那么调用
invalidate
似乎更干净。

我去过MSDN并检查了函数,但我得出的结论是,它们最终通过使矩形无效而向窗口发送WM_绘制。您的问题的答案是肯定的,内容无效(它是桌面的图像)。我以恒定的速率向窗口发送图像,然后向窗口发送一个图像,以使其得到更新-我是否可以问一下另一个原因可能是什么?另一个原因可能是什么?可能值得注意的是,所有“重画”都需要一个
WM_PAINT
消息。这是不可能的<代码>重画窗口
还将向您的窗口发送一个
WM_PAINT
。不同之处在于,
RedrawWindow
将以立即处理的方式发送。另请参见一个重要注意事项,
RedrawWindow
使您可以控制子项是否无效
invalidate
不提供此控件-如果指定了
WS_CLIPCHILDREN
,则它将永远不会使子项无效,否则它将使子项无效,但它取决于被无效的确切矩形,并且规则非常模糊。如果要使窗口及其子窗口无效,则需要将
重画窗口
RDW_ALLCHILDREN
-忽略
无效设置