windows - 无边框窗口。如何添加阴影和删除 1px 边框?

标签 windows winapi borderless

我需要创建一个具有指定背景颜色的无边框窗口。我知道如何删除非客户区并得到这样的东西:

enter image description here

这很酷,但不是我真正想要的。如果您仔细观察任何气动窗口 - 它周围有一个阴影(实际上这不是阴影而是一些发光)。我发现某处可以使用此代码添加阴影:

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

它几乎完成了它的工作(认为这对我来说绝对不清楚 - 文档没有提到影子和这个函数的关系)。几乎。窗口周围出现了一个细边框。它看起来像是半透明的,破坏了窗口的外观和感觉:

enter image description here

我知道这是可能的—— Visual Studio 甚至以某种方式改变了这个边框的颜色!

更新:正如 IInspectable 在评论中注意到的那样,我可以在 DwmExtendFrameIntoClientArea() 中使用负边距。我设置了 -1 值并得到了这个结果:

enter image description here

如您所见 - 它甚至更奇怪。我尝试用颜色填充背景,但没有成功。

最佳答案

调用此函数后删除一个像素边框:

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

您需要覆盖 WndProc WM_NCCALCSIZE 消息,并返回 0 作为结果。 您还需要使用 WS_CAPTION 样式创建窗口。 (在 Windows XP 上这段代码不会产生矩形窗口,但在 WinXP 上没有阴影,所以在 Windows XP 上你应该回退到 WS_POPUP 窗口样式)
顺便说一下,要添加阴影,使用这个边距就足够了:
const MARGINS shadow_on = { 1, 0, 0, 0 };

这是干净的 Windows API 代码示例,如何创建这样的窗口,它是用 Delphi 编写的:https://stackoverflow.com/a/44489430/877099

关于windows - 无边框窗口。如何添加阴影和删除 1px 边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30072981/

相关文章:

forms - 在 Delphi 中以无边框形式/窗口平滑调整大小

java - 如何在java中刷新dns

c++ - 加密变量

windows - 将函数从系统剪贴板粘贴到 gVIM

c - 将入口点更改为PE文件中新添加的shellcode段后,如何恢复主进程?

c++ - Aero Snap 的无边框窗口在最大化状态下太大

c - NtQueryInformationThread 在我的代码中总是失败?

c++ - 如何比较两个 HANDLE 类型的变量

c++ - WTS_CONNECTSTATE_CLASS 枚举类

linux - Linux 上的无边框窗口