gpt4 book ai didi

c++ - 使用 Areo Snap、阴影、最小化动画和抖动的无边框窗口

转载 作者:IT老高 更新时间:2023-10-28 12:43:01 27 4
gpt4 key购买 nike

我正在 Windows 上制作一个带有无边框窗口的应用程序。但是,由于窗口是无边框的,所以我没有区域阴影、捕捉、最小化动画或抖动。我环顾四周,发现没有解释如何实现这一点的网站。但是,我知道这是可能的,因为 Office 2013、Visual Studio 2012 和 Steam 都具有这些功能并且是无边界的。我专门使用 QT 和 C++,但如果你已经为另一个窗口库解决了这个问题,我也想听听你的解决方案。任何一个。我所说的区域阴影并不是指两侧的阴影,而是指所有事件的本地区域窗口应用程序的所有侧面的发光阴影。

最佳答案

使用 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.

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

请注意:DwmExtendFrameIntoClientArea 完全符合其名称的含义,因此,如果您将带有 alpha channel 的图像直接绘制到您的客户区(例如使用 opengl、direct3d/2d),则通过它可以看到小框架:

borderless window with shadow and frame showing in client area

所以你可能不得不在透明元素后面放置一个非透明小部件、画笔或其他东西。

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

enter image description here

Here is a small example project , F11 切换无边框/窗口模式,F12 打开和关闭无边框阴影。

关于c++ - 使用 Areo Snap、阴影、最小化动画和抖动的无边框窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16765561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com