使用Areo捕捉,阴影,最小化animation和抖动的无边界窗口

我正在使用Windows上的无边界窗口进行应用程序。 但是,由于窗口是无边界的,所以我没有阴影,捕捉,最小化animation或摇动。 我环顾四周,发现没有解释如何实现这一点的网站。 不过,我知道这是可能的,因为Office 2013,Visual Studio 2012和Steam都具有这些function并且是无边界的。 我特别使用QT和C ++,但如果你已经解决了另一个窗口库,我想听听你的解决scheme。 无论是。 而且,我并不是说两边都是阴影,我的意思是所有活动的本地窗口应用程序的四面八方都有一层阴影。

Solutions Collecting From Web of "使用Areo捕捉,阴影,最小化animation和抖动的无边界窗口"

在使用Spy ++检查Steam的窗口(窗口样式,它是如何回复窗口消息的)并尝试匹配它所做的所有事情之后,再结合使用这个C#无边框窗口行为的DWMAPI调用,我相信我已经知道了。

要隐藏窗口的边框,请在WindowProc中处理WM_NCCALCSIZE消息:

 case WM_NCCALCSIZE: { if (window->is_borderless) return 0; else return DefWindowProc(hwnd, msg, wparam, lparam); } 

要启用阴影,你需要做的是:

 MARGINS borderless = {1,1,1,1}; DwmExtendFrameIntoClientArea(hwnd, &borderless); 

要将其恢复关闭,请恢复默认页边空白MARGINS windowed = {0,0,0,0}; 也许抛出一个SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS | SWP_NOSIZE | SWP_NOMOVE ); 此外,以确保框架重绘。

但是,这似乎并不适用于所有窗口样式, 显然你的窗口样式不能包含标题栏标题栏工作正常,并且添加一个似乎启用最小化动画。

我得到的最简单的窗口风格是WS_POPUP | WS_THICKFRAME WS_POPUP | WS_THICKFRAME ,以获得航空捕捉,最大化,最小化和平滑最小化我使用的动画WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION

通过DwmSetWindowAttribute更改DWMWA_NCRENDERING_POLICYDWMWA_ALLOW_NCPAINT似乎不是必需的,默认设置似乎工作。

需要注意的一点是: DwmExtendFrameIntoClientArea正是名字所暗示的,所以如果你直接在你的客户区(比如说用opengl,direct3d / 2d)绘制一个带alpha通道的图像,那么一个小框架就可以通过它看到:

无边界的窗口与阴影和框架显示在客户端区域

所以你可能不得不把一个不透明的小部件,刷子或东西放在透明元素后面。

如果一切顺利的话,它应该是这样的:

在这里输入图像说明

这是一个小例子项目 ,F11切换无边界/窗口模式,F12切换无边界阴影。

感谢melak47你的答案。

对于那些正在寻找一个C ++ / Qt例子的人来说,这个GitHub专家可以像melak47代码那样做一个魅力(感谢deimos1877)! https://github.com/deimos1877/BorderlessWindow

一定要使用Visual Studio编译器(> = 2010)来获取所需的DLL,它应该工作。 这个例子包括航空器支持,无边框窗口,最小化效果,航空阴影。