How do you use DwmGetColorizationColor?
The documentation says it returns two values:
0xAARRGGBB containing the color used for glass compositionHere's a color that i like, a nice puke green:

You can notice the color is greeny, and the translucent title bar (against a white background) shows the snot color very clearly:

i try to get the color from …
我必须在客户区涂上什么颜色才能制作玻璃?
我使用以下方法将表单框架扩展到客户区:
DwmExtendFrameIntoClientArea(self.Handle, margins);
Run Code Online (Sandbox Code Playgroud)
我找不到微软的官方文档,说明DWM用玻璃代替什么颜色和/或alpha.DwmExtendFrameInClientArea上的文档甚至没有提到需要自定义颜色.只有传闻和神话,甚至需要特殊的颜色.
我能找到的最接近的是MSDN上的主题:
使用DWM的自定义窗口框架
为了使扩展帧可见,每个扩展帧的边下面的区域必须具有alpha值为0的像素数据.
更新:和博客文章:
Windows Vista for Developers - 第3部分 - 桌面窗口管理器
碰巧RGB黑色(0x00000000)的位模式与100%透明ARGB的位模式相同,因此您可以使用"黑色"GDI画笔实际绘制并假设您已指示DWM模糊绘制区域,结果将是所需的玻璃效果.
如果我按照他们的字面意思(alpha值为零的像素数据),我构造一个零alpha的颜色,并在扩展区域绘制:
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Run Code Online (Sandbox Code Playgroud)
但玻璃效果没有出现:
替代文字http://i46.tinypic.com/anlmd4.png
如果我忽略引用的MSDN主题,而是使用完全不透明的黑色(而不是完全透明的黑色):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Run Code Online (Sandbox Code Playgroud)
玻璃效果确实出现了:
alt text http://i45.tinypic.com/2ug2ias.png
然后我开始相信不透明的黑色是DWM用玻璃代替的像素值.
但那我如何在玻璃区域上画黑色物品呢?
我测试过在玻璃区域上画一个黑色矩形,旁边有一个圆圈.奇怪的是,矩形没有出现,而圆圈确实出现; 两者颜色相同:
Brush …Run Code Online (Sandbox Code Playgroud) 在Windows 10上使用未记录的SetWindowCompositionAttributeAPI,可以为窗口启用玻璃.玻璃是白色或透明的,如截图所示:
但是,Windows 10"开始"菜单和通知中心(均使用玻璃)都与强调色混合,如下所示:
它是如何做到的?
以下示例中的重点颜色为浅紫色 - 这是设置应用程序中的屏幕截图:
此示例代码中定义的AccentPolicy结构具有重音状态,标志和渐变颜色字段:
AccentPolicy = packed record
AccentState: Integer;
AccentFlags: Integer;
GradientColor: Integer;
AnimationId: Integer;
end;
Run Code Online (Sandbox Code Playgroud)
并且州可以具有以下任何值:
ACCENT_ENABLE_GRADIENT = 1;
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2;
ACCENT_ENABLE_BLURBEHIND = 3;
Run Code Online (Sandbox Code Playgroud)
请注意,前两个是在这个github gist上找到的.
第三个工作正常 - 这使玻璃.其他两个,
所以这就越来越近了,它似乎是像音量控制小程序一样使用的一些弹出窗口.
这些值不能一起排序,并且GradientColor字段的值除了必须为非零之外没有任何效果.
直接在玻璃窗口上绘图会导致非常奇怪的混合.这里用红色填充客户区(ABGR格式为0x000000FF):
任何非零的alpha,例如0xAA0000FF,都不会产生任何颜色:
既不匹配"开始"菜单或通知区域的外观.
这些窗户是如何做到的?
使用GDI +在玻璃上绘制文字:
graphics.DrawString(s, Length(s), font, MakePointF(x, y), brush);
Run Code Online (Sandbox Code Playgroud)
您会注意到启用ClearType的文本在玻璃上绘制得非常糟糕:
但是当玻璃禁用时,文字当然画得很好:
通过比较,这里是反别名字体平滑:
这里没有字体平滑:
注意:没有字体平滑看起来比实际更好,因为StackOverflow会调整显示器上的图像大小.
如何在玻璃上绘制ClearType文本?
Mark建议的是,你不能尊重用户对文本渲染的偏好(即" SystemDefault".ClearType不能在玻璃上起作用,你也不能使用它.
换句话说,如果您在玻璃上渲染,则必须使用以下方式覆盖文本渲染:
graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
Run Code Online (Sandbox Code Playgroud)
否则你应该保留TextRenderingHint它的默认值TextRenderingHintSystemDefault.