6

我需要创建一个具有指定背景颜色的无边框窗口。我知道如何删除非客户区并获得如下信息:

在此处输入图像描述

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

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

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

在此处输入图像描述

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

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

在此处输入图像描述

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

4

1 回答 1

3

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

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

您需要覆盖 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

于 2017-06-14T15:35:23.497 回答