Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以原子方式更新HWND的样式和位置?_C++_Windows_Winapi - Fatal编程技术网

C++ 如何以原子方式更新HWND的样式和位置?

C++ 如何以原子方式更新HWND的样式和位置?,c++,windows,winapi,C++,Windows,Winapi,我正在编写一个Win7桌面应用程序,希望它能够无缝地从窗口切换到窗口全屏,反之亦然。我主要是通过调用更新其样式,然后立即更新其大小和位置来实现这一点。问题是窗口闪烁一帧以显示其样式已更新,但未显示新的大小和位置。下一帧看起来一切正常,但我正试图避免这个单帧伪影 我试着颠倒调用API的顺序,但它只是改变了工件的外观。我也尝试过隐藏窗口,调用API,然后显示窗口,但这只会导致窗口在一帧内消失 我知道一个选择是创建一个具有所需属性的新窗口,然后销毁旧窗口,但我想找到一个更便宜的替代方案 那么,有没有办

我正在编写一个Win7桌面应用程序,希望它能够无缝地从窗口切换到窗口全屏,反之亦然。我主要是通过调用更新其样式,然后立即更新其大小和位置来实现这一点。问题是窗口闪烁一帧以显示其样式已更新,但未显示新的大小和位置。下一帧看起来一切正常,但我正试图避免这个单帧伪影

我试着颠倒调用API的顺序,但它只是改变了工件的外观。我也尝试过隐藏窗口,调用API,然后显示窗口,但这只会导致窗口在一帧内消失

我知道一个选择是创建一个具有所需属性的新窗口,然后销毁旧窗口,但我想找到一个更便宜的替代方案


那么,有没有办法调用这些API并让它们以原子的方式直观地反映出来呢?作为奖励,将多个结果WM_大小的消息合并到一个事件中也很好,但我可以在消息处理程序中自己管理它。

你说的窗口全屏是什么意思?它与最大化相同吗


如果是这样,hwnd,SW_最大化?

您所说的窗口全屏是什么意思?它与最大化相同吗

如果是这样,hwnd、SW_最大化?

表示:

某些窗口数据是缓存的,因此使用 在您调用 功能

所以这应该行得通。也许可以尝试使用SetWindowPos而不是MoveWindow

当您得到由这些调用引起的事件时,您在window proc中做了什么有趣的事情吗?特别是,您是否正在调整尺寸或类似的东西?

说:

某些窗口数据是缓存的,因此使用 在您调用 功能

所以这应该行得通。也许可以尝试使用SetWindowPos而不是MoveWindow


当您得到由这些调用引起的事件时,您在window proc中做了什么有趣的事情吗?特别是,您是否正在调整尺寸或类似的东西?

请查看;使用它禁用重画,更改窗口样式,然后调用重画窗口HWND、NULL、NULL、RDW_擦除| RDW_帧| RDW_无效| RDW_所有子项以原子方式显示它们。

签出;使用它来禁用重画、更改窗口样式,然后调用重画窗口Hwnd、NULL、NULL、RDW_ERASE、RDW_FRAME、RDW_INVALIDATE、RDW_ALLCHILDREN以原子方式显示它们。

在Windows中可靠地执行此类操作很困难,特别是因为Vista作为DWM可能会使事情复杂化。这通常是一个反复试验的问题,直到你找到一个适合你的解决方案

SetWindowPos有一个SWP_NOREDRAW标志,用于防止响应调用重新绘制窗口。因此,您可以尝试先更改位置,然后更新样式,最后第三次调用在新位置重新绘制窗口。比如说,

SetWindowPos(hWnd, 0, x, y, w, h, SWP_NOREDRAW | SWP_NOZORDER);
SetWindowLongPtr(hWnd, GWL_STYLE, dwNewStyles);
RedrawWindow(hWnd, 0, 0, RDW_INVALIDATE | RDW_FRAME);

在Windows中可靠地完成这类工作是很困难的,特别是因为Vista作为DWM会使事情变得复杂。这通常是一个反复试验的问题,直到你找到一个适合你的解决方案

SetWindowPos有一个SWP_NOREDRAW标志,用于防止响应调用重新绘制窗口。因此,您可以尝试先更改位置,然后更新样式,最后第三次调用在新位置重新绘制窗口。比如说,

SetWindowPos(hWnd, 0, x, y, w, h, SWP_NOREDRAW | SWP_NOZORDER);
SetWindowLongPtr(hWnd, GWL_STYLE, dwNewStyles);
RedrawWindow(hWnd, 0, 0, RDW_INVALIDATE | RDW_FRAME);

不,我指的是WS_弹出式风格,客户端rect等于监视器rect。也称为,这会在使用DirectX时提高效率。看起来SW_MAXIMIZE确实可以作为MoveWindow的替代品,但它并没有消除工件,因为我仍然需要首先调整窗口样式。不,我是说WS_弹出式样式,客户端rect等于监视器rect。也称为,这会在使用DirectX时提高效率。看起来SW_MAXIMIZE确实可以作为MoveWindow的替代品,但它并没有消除瑕疵,因为我仍然需要首先调整窗口样式。我也尝试过SetWindowPos,它产生了相同的结果。我在wndproc中所做的唯一一件事就是为Alt+Enter命令处理WM_SYSCHAR。我确实修正了大小,但只有当它小于128像素时,所以在本例中,它不会被调试器验证。我也尝试过SetWindowPos,它会产生相同的结果。我在wndproc中所做的唯一一件事就是为Alt+Enter命令处理WM_SYSCHAR。我确实修正了大小,但前提是它小于128像素,因此在这种情况下,它不会被调试器验证。窗口可能会忽略此消息窗口可能会忽略此消息最准确的答案,尽管我无法在多台计算机上获得一致无伪影的任何内容,包括使用重画窗口的方法。最准确的答案,尽管我无法得到 在多台机器上一致无伪影的任何东西,包括使用重画窗口方法。