无边框窗口.如何添加阴影并删除1px边框?

nik*_*ack 5 windows winapi borderless

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

在此输入图像描述

这很酷但不是我想要的.如果你仔细看看任何一个航空窗口 - 它周围有一个阴影(实际上这不是阴影,而是一些发光).我找到了一个可以使用此代码添加阴影的地方:

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

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

在此输入图像描述

我知道这是可能的 - 视觉工作室甚至以某种方式改变了这个边界的颜色!

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

在此输入图像描述

正如你所看到的 - 它甚至更奇怪.我试图用颜色填充背景,但没有运气.

Eug*_*ala 3

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

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

您需要重写 WndProcWM_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