【发布时间】:2010-11-23 16:26:52
【问题描述】:
使用GDI+绘制各种颜色:
brush = new SolidBrush(color);
graphics.FillRectangle(brush, x, y, width, height);
您会注意到玻璃上没有正确显示不透明的颜色:
如何在玻璃上绘制纯色?
您还会注意到,完全不透明的颜色的处理方式会有所不同,具体取决于它是什么颜色:
- 不透明黑色:完全透明
- 不透明颜色:部分透明
- 不透明的白色:完全不透明
谁能告诉我桌面合成器上解释如何处理不同颜色的文档?
更新 3
您还会注意到FillRectangle 的行为与FillEllipse 不同:
-
FillEllipse用不透明颜色绘制不透明颜色 -
FillRectangle使用不透明颜色绘制部分(或完全)透明
请解释无意义的行为。
更新 4
Alwayslearning 建议我更改合成模式。来自MSDN:
CompositingMode 枚举
CompositingMode 枚举指定渲染颜色与背景颜色的组合方式。 Graphics 类的
Graphics::GetCompositingMode和'Graphics::SetCompositingMode' 方法使用此枚举。CompositingModeSourceOver指定当一种颜色被渲染时,它与背景颜色混合。混合由正在渲染的颜色的 alpha 分量决定。
CompositingModeSourceCopy指定当一种颜色被渲染时,它会覆盖背景颜色。此模式不能与 TextRenderingHintClearTypeGridFit 一起使用。
从CompositingModeSourceCopy 的描述来看,这听起来不是我想要的选项。从它施加的限制来看,这听起来像是我想要的选择。在禁用合成或透明度的情况下,它不是我想要的选项,因为它执行的是 SourceCopy,而不是 SourceBlend:
幸运的是,这不是我必须考虑的邪恶,因为它不能解决我的实际问题。在构造我的graphics 对象后,我尝试更改合成模式:
graphics = new Graphics(hDC);
graphics.SetCompositingMode(CompositingModeSourceCopy); //CompositingModeSourceCopy = 1
结果对输出没有影响:
注意事项
- Win32 原生
- 不是 .NET(即本机)
- 不是 Winforms(即本机)
- GDI+(即原生)
另见
【问题讨论】:
-
需要更多的手绘圆圈。
-
我一定遗漏了一些东西,因为我的答案是“使用 254 作为 alpha 值”。你真的需要额外的 1/256 不透明度吗?
-
如果使用 ExtTextOut 而不是 FillRectangle 会发生什么?这是在 GDI 中绘制矩形的“正常”方式,不确定 GDI+。
-
@Tergiver 指的是
ExtTextOut已被用作性能提升。它与PatBlt(是?)一起比FillRect快。它不需要创建和管理画笔。
标签: aero dwm aero-glass