我正在Windows上创建一个带无边框窗口的应用程序。但是,由于窗口是无边框的,我没有阴影,快照,最小化动画或抖动。我环顾四周,发现没有解释如何实现这一点的网站。但是,我知道这是可能的,因为Office 2013,Visual Studio 2012和Steam都具有这些功能并且是无边界的。我专门使用QT和C ++但是如果你已经为另一个窗口库解决了这个问题,我也想听听你的解决方案。无论是。并且通过areo shadow我并不是指两边的阴影,我的意思是所有活动的原生areo windows应用程序的所有方面都是发光的阴影。
答案 0 :(得分:37)
使用Spy ++检查Steam的窗口(它的窗口样式,它如何回复窗口消息)并尝试匹配它所做的一切,再加上来自这个C# borderless window behavior的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_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION
。
通过DWMWA_NCRENDERING_POLICY
改变DWMWA_ALLOW_NCPAINT
或DwmSetWindowAttribute
似乎不是必需的,默认设置似乎有效。
提醒一句:DwmExtendFrameIntoClientArea
完全符合名称的建议,所以如果您将带有Alpha通道的图像直接绘制到客户区(例如使用opengl,direct3d / 2d),那么一个小框架将会通过它可以看到:
因此,您可能需要在透明元素后面放置一个非透明的小部件,画笔或其他东西。
如果一切顺利,那么它应该是这样的:
Here is a small example project,F11切换无边框/窗口模式,F12打开和关闭无边框阴影。
答案 1 :(得分:11)
感谢melak47的回答。
对于正在寻找C ++ / Qt示例的人来说,这个GitHub profect就像基于melak47代码的魅力(感谢deimos1877)一样! https://github.com/deimos1877/BorderlessWindow
一定要使用visual studio编译器(> = 2010)来获取所需的DLL,它应该可以工作。 这个例子包括aerosnap支持,无边框窗口,最小化效果,航空阴影。
答案 2 :(得分:1)