SetWindowPos是否立即绘制

时间:2016-04-29 08:56:46

标签: c++ windows winapi

在每次鼠标移动事件中,我正在移动窗口。从文档中可以看出,如果移动成功,SetWindowPos将返回非零值。

我想确认我的推断,每次SetWindowPos返回非零值时,移动已经发生。这意味着,窗口实际上已在新位置重新绘制,然后才返回该功能。在函数返回后,移动将在稍后发生(当处理某种消息时)不会发生。

2 个答案:

答案 0 :(得分:3)

  

我想确认我的推断,每次SetWindowPos返回非零值时,移动已经发生。这意味着,窗口实际上已被重新绘制

这是错误的假设。成功的移动和非零的回归与绘画无关。

API更改位置,非零返回值确认接受了新值。 API不承诺,不会将完整的重绘周期作为其执行的一部分。更重要的是,位置,Z顺序等的变化也可能影响其他窗口的可见性,这反过来又需要重新绘制,而这又必须在相应的线程上发生。重新计划已安排,它们与SetWindowPos返回不同步。 MSDN上的文档没有关于重新绘制/更新的任何承诺。然后从API返回零表示您的参数根本不被接受(尤其是无效的窗口句柄)。

Bonus reading

  

当您调用SetWindowPos函数时,窗口管理器会更新窗口大小,位置等等,然后重新绘制受操作影响的窗口。 默认情况下,SetWindowPos函数会在返回之前快速重新绘制窗口。函数返回后,正常的WM_PAINT消息完成了绘制窗口的实际工作。快速重绘是为了立即反馈窗口确实改变了它的大小,位置等等。

答案 1 :(得分:2)

SetWindowPos在完成ist作业后返回imidialty。

但是主要绘画被推迟,直到窗口收到WM_NCPAINT和WN_PAINT。从我的经验来看,我可以说框架的更改通常由SetWindowPos直接绘制。

如果您希望窗口完全重绘,请在调用SetWindowPos后调用UpdateWindow或RedrawWindow(带有适当的标志)