我有一个透明的表格 . (只需匹配背景颜色和透明度键即可完成 .
当试图绘制透明的东西时,它根本不起作用 . 随着alpha变量越来越接近0,绘制的颜色越来越接近表单的原始背景颜色 .
SolidBrush opaqueBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255));
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255));
SolidBrush superTransBrush = new SolidBrush(Color.FromArgb(10, 0, 0, 255));
使用这3个刷子以规则形式绘制将产生所需效果 . 但是在我的透明表单上使用它只是将superTransBrush与我的transparencyKey / Background颜色匹配,而semiTransBrush介于我想要的颜色和背景之间 . 无论如何围绕这个?
2 回答
.NET Forms本身似乎没有办法解决这个问题 .
alpha blending in .NET的定义指出:
请注意,在计算alpha混合时,没有考虑背景本身的透明度 .
最接近的解决方法是将
CompositingMode
设置为源副本:这可以防止透明颜色与背景颜色混合,因此您的画笔将是蓝色,而不是蓝色背景颜色的混合 . 但是,你的画笔仍然是不透明的 .
Background
Windows Forms构建在GDI和GDI之上 .
GDI是一种非常古老的技术,在Windows历史上可以追溯到很长一段时间,并不是为了识别alpha而设计的 .
GDI随WindowsXP和后续产品一起提供,旨在通过alpga混合,消除锯齿以及您期望从现代2D图形库中获得的其他此类功能来补充GDI .
不幸的是,GDI并没有让GDI识别alpha,在某些情况下它只会伪造alpha .
Your Scenario
在您的情况下,它会伪造Alpha通道,并在对表单执行透明操作之前将SolidBrush颜色绘制到表单上,因此,渲染器会看到与您为透明度指定的颜色不同的颜色并忽略它 .
My Scenario
在我的情况下,我试图绘制一个无边框形式的投影 . 有效 . 但它真是太糟糕了 .
我已经实现了你想要做的事情,但你不会纯粹使用Managed C#/ .NET;你将不得不使用P / Invoke直接调用GDI / GDI .