我需要创建一个具有指定背景颜色的无边框窗口。我知道如何删除非客户区并得到这样的东西:
这很酷,但不是我真正想要的。如果您仔细观察任何气动窗口 - 它周围有一个阴影(实际上这不是阴影而是一些发光)。我发现某处可以使用此代码添加阴影:
const MARGINS shadow_on = { 1, 1, 1, 1 };
DwmExtendFrameIntoClientArea(hwnd, &shadow_on);
它几乎完成了它的工作(认为这对我来说绝对不清楚 - 文档没有提到影子和这个函数的关系)。几乎。窗口周围出现了一个细边框。它看起来像是半透明的,破坏了窗口的外观和感觉:
我知道这是可能的—— Visual Studio 甚至以某种方式改变了这个边框的颜色!
更新:正如 IInspectable 在评论中注意到的那样,我可以在 DwmExtendFrameIntoClientArea()
中使用负边距。我设置了 -1 值并得到了这个结果:
如您所见 - 它甚至更奇怪。我尝试用颜色填充背景,但没有成功。
最佳答案
调用此函数后删除一个像素边框:
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/