使用Areo Snap,Shadow,最小化动画和摇动的无边框窗口

jos*_*son 30 c++ windows qt aero borderless

我在Windows上使用无边框窗口创建应用程序.但是,由于窗口是无边框的,我没有阴影,快照,最小化动画或抖动.我环顾四周,发现没有解释如何实现这一点的网站.但是,我知道这是可能的,因为Office 2013,Visual Studio 2012和Steam都具有这些功能并且是无边界的.我专门使用QT和C++但是如果你已经为另一个窗口库解决了这个问题,我也想听听你的解决方案.无论是.并且通过areo shadow我并不是指两侧的阴影,我的意思是所有活动的本机areo windows应用程序的所有方面的发光阴影.

mel*_*k47 40

在使用Spy ++检查Steam的窗口(它的窗口样式,它如何回复窗口消息)并尝试匹配它所做的一切之后,结合这个C#无边框窗口行为的DWMAPI调用,我相信我弄明白了.

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

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

要启用阴影,您需要做的就是:

MARGINS borderless = {1,1,1,1};
DwmExtendFrameIntoClientArea(hwnd, &borderless);
Run Code Online (Sandbox Code Playgroud)

要将其关闭,请恢复默认边距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_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION.

看似不需要更改DWMWA_NCRENDERING_POLICYDWMWA_ALLOW_NCPAINT通过DwmSetWindowAttribute,默认设置似乎有效.

需要注意的一点:DwmExtendFrameIntoClientArea确切地说明了名称的含义,因此如果您将带有Alpha通道的图像直接绘制到客户区(例如使用opengl,direct3d/2d),则可以通过它看到一个小框架:

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

因此,您可能必须在透明元素后面放置一个非透明的小部件,画笔或其他东西.

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

在此输入图像描述

这是一个小例子项目,F11切换无边框/窗口模式,F12打开和关闭无边框阴影.


Kév*_*lla 11

感谢melak47的回答.

对于正在寻找C++/Qt示例的人来说,这个GitHub功能可以像基于melak47代码的魅力(感谢deimos1877)一样完成工作! https://github.com/deimos1877/BorderlessWindow

一定要使用visual studio编译器(> = 2010)来获取所需的DLL,它应该可以工作.此示例包括aerosnap支持,无边框窗口,最小化效果,航空阴影.

  • 我想说,这是最好的答案,希望新人来这里使用这个演示. (2认同)