相关疑难解决方法(0)

Vista/7: How to get glass color?

How do you use DwmGetColorizationColor?

The documentation says it returns two values:

  • a 32-bit 0xAARRGGBB containing the color used for glass composition
  • a boolean parameter that is true "if the color is an opaque blend" (whatever that means)

Here'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 …

winapi aero dwm user-preferences

53
推荐指数
2
解决办法
6917
查看次数

Windows Aero:要绘制什么颜色的"玻璃"?

我必须在客户区涂上什么颜色才能制作玻璃

我使用以下方法将表单框架扩展到客户区:

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 gdi+ aero dwm

30
推荐指数
1
解决办法
2876
查看次数

如何在Windows 10上设置玻璃混合颜色?

在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上找到的.

第三个工作正常 - 这使玻璃.其他两个,

  • 无论背后是什么,ACCENT_ENABLE_GRADIENT都会产生一个完全灰色的窗口.没有透明度或玻璃效果,但绘制的窗口颜色是由DWM绘制的,而不是由应用程序绘制的.

在此输入图像描述

  • ACCENT_ENABLE_TRANSPARENTGRADIENT导致窗口完全涂上强调色,无论其背后是什么.没有透明度或玻璃效果,但绘制的窗口颜色是由DWM绘制的,而不是由应用程序绘制的.

在此输入图像描述

所以这就越来越近了,它似乎是像音量控制小程序一样使用的一些弹出窗口.

这些值不能一起排序,并且GradientColor字段的值除了必须为非零之外没有任何效果.

直接在玻璃窗口上绘图会导致非常奇怪的混合.这里用红色填充客户区(ABGR格式为0x000000FF):

在此输入图像描述

任何非零的alpha,例如0xAA0000FF,都不会产生任何颜色:

在此输入图像描述

既不匹配"开始"菜单或通知区域的外观.

这些窗户是如何做到的?

winapi aero dwm aero-glass windows-10

20
推荐指数
3
解决办法
1万
查看次数

Aero:如何在Glass上绘制ClearType文本?

使用GDI +在玻璃上绘制文字:

graphics.DrawString(s, Length(s), font, MakePointF(x, y), brush);
Run Code Online (Sandbox Code Playgroud)

您会注意到启用ClearType的文本在玻璃上绘制得非常糟糕:

替代文字

但是当玻璃禁用时,文字当然画得很好:

替代文字

通过比较,这里是反别名字体平滑:

替代文字

这里没有字体平滑:

替代文字

注意:没有字体平滑看起来比实际更好,因为StackOverflow会调整显示器上的图像大小.

如何在玻璃上绘制ClearType文本?

笔记

  • Win32原生
  • 不是.NET(原生)
  • 不是Winforms(原生)
  • GDI +(原生)

Mark建议的是,你不能尊重用户对文本渲染的偏好(即" SystemDefault".ClearType不能在玻璃上起作用,你也不能使用它.

换句话说,如果您在玻璃上渲染,则必须使用以下方式覆盖文本渲染:

graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
Run Code Online (Sandbox Code Playgroud)

否则你应该保留TextRenderingHint它的默认值TextRenderingHintSystemDefault.

也可以看看

aero cleartype aero-glass

11
推荐指数
1
解决办法
2048
查看次数