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

时间:2015-05-06 09:40:08

标签: windows winapi borderless

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

enter image description here

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

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

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

enter image description here

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

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

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

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