问题描述
我正在制作一个在 Windows 上带有无边框窗口的应用程序.但是,由于窗口是无边框的,所以我没有阴影、捕捉、最小化动画或抖动.我环顾四周,没有找到解释如何实现这一点的网站.但是,我知道这是可能的,因为 Office 2013、Visual Studio 2012 和 Steam 都具有这些功能并且是无边界的.我专门使用 QT 和 C++,但如果您已经为另一个窗口库解决了这个问题,我也想听听您的解决方案.任何一个.我所说的 areo 阴影并不是指两侧的阴影,我指的是所有活动的本机 areo windows 应用程序的所有侧面的发光阴影.
在使用 Spy++ 检查 Steam 的窗口(它的窗口样式,它如何回复窗口消息)并尝试匹配它所做的一切之后,结合来自这个 ,F11切换无边框/窗口模式,F12切换无边框阴影开启并关闭.
I am making a application with a borderless window on Windows. However, since the window is borderless, I have no areo shadow, snap, minimization animation, or shake. I have looked around and found no site that explains how to implement this. However, I know it is possible because Office 2013, Visual Studio 2012, and Steam all have these features and are borderless. I am specifically using QT and C++ but if you have solved this for another windowing library I would like to hear your solutions as well. either. And by areo shadow I don't mean drop shadow on two sides, I mean the glowing shadow on all sides of all active native areo windows applications.
After using Spy++ to inspect Steam's window (its window styles, how it replies to window messages) and trying to match everything it does, combined with the DWMAPI calls from this C# borderless window behavior, I believe I figured it out.
To hide the window's border, handle the WM_NCCALCSIZE
message in your WindowProc:
case WM_NCCALCSIZE: {
if (window->is_borderless) {
return 0;
} else {
return DefWindowProc(hwnd, msg, wparam, lparam);
}
}
To enable the shadow, all you need to do is:
MARGINS borderless = {1,1,1,1};
DwmExtendFrameIntoClientArea(hwnd, &borderless);
To turn it back off, restore the default margins MARGINS windowed = {0,0,0,0};
.
Perhaps throw in a SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS | SWP_NOSIZE | SWP_NOMOVE );
also, to make sure the frame gets redrawn.
However, this does not seem to work with all window styles, apparently your window style must not contain a titlebar. Title bars work fine, and adding one seems to enable the minimize animation.
The simplest window style I got the shadow to work with was WS_POPUP | WS_THICKFRAME
, to also get aero snap, maximizing, minimizing, and the smooth minimize animation I used WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION
.
Changing DWMWA_NCRENDERING_POLICY
or DWMWA_ALLOW_NCPAINT
via DwmSetWindowAttribute
does not appear to be required, the default settings seem to work.
One word of caution: DwmExtendFrameIntoClientArea
does exactly what the name suggests, so if you are drawing an image with an alpha channel directly into your client area (say with opengl, direct3d/2d), a small frame will be visible through it:
So you might have to put a non transparent widget, brush or something behind the transparent element.
If all goes well, it should then look like this:
Here is a small example project, F11 toggles borderless/windowed mode, F12 toggles the borderless shadow on and off.
这篇关于使用 Areo Snap、阴影、最小化动画和抖动的无边框窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!