SetWindowPos是否立即绘制

Does SetWindowPos paint immediately

本文关键字:绘制 是否 SetWindowPos      更新时间:2023-10-16

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

我想证实我的推断,即每次SetWindowPos返回一个非零值时,移动就已经发生了。这意味着,窗户实际上已经在新的位置重新喷漆,只有这样功能才会返回。在函数返回后的一段时间内(当处理某种消息时),移动不会发生。

我想证实我的推断,即每次SetWindowPos返回一个非零值时,移动就已经发生了。这意味着,窗户实际上已经被重新喷涂了

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

API更改位置,非零返回值确认接受新值。API不承诺,也不将整个重新绘制循环作为其执行的一部分。更重要的是,位置、Z顺序等的变化也可能影响其他窗口的可见性,而这些窗口又需要重新绘制,而这又必须发生在相应的线程上。重新绘制已排定,它们与SetWindowPos返回不同步。MSDN上的文档没有任何关于重新绘制/更新的承诺。那么API的零返回表示您的参数根本不被接受(特别是无效的窗口句柄)。

奖金阅读:

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

SetWindowPos在完成其工作后立即返回。

但是主绘制被推迟,直到窗口接收到WM_NCPAINT和WM_PAINT。根据我的经验,我可以说对框架的更改通常是由SetWindowPos直接绘制的。

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