在Full .NET框架中,您可以使用Color.FromArgb()方法创建一个带有alpha混合的新颜色,如下所示:
Color blended = Color.FromArgb(alpha, color);
或
Color blended = Color.FromArgb(alpha, red, green , blue);
然而,在Compact Framework(特别是2.0)中,这些方法都不可用,只能得到:
Color.FromArgb(int red, int green, int blue);
和
Color.FromArgb(int val);
第一个,显然,甚至不允许你输入alpha值,但后者的文档显示“val”是32位ARGB值(与标准24位0xRRGGBB相反为0xAARRGGBB),因此它有意义的是你可以构建ARGB值并将其传递给函数。我尝试了以下内容:
private Color FromARGB(byte alpha, byte red, byte green, byte blue)
{
int val = (alpha << 24) | (red << 16) | (green << 8) | blue;
return Color.FromArgb(val);
}
但无论我做什么,alpha混合都不会起作用,即使将alpha值设置为0,结果颜色也始终为完全不透明度。
有没有人让这个在Compact Framework上工作?
答案 0 :(得分:1)
显然,它并不是那么简单,但如果您使用的是Windows Mobile 5.0或更新版本,请still possible。
答案 1 :(得分:0)
哇...如果我必须把所有代码放进去(并且做本机互操作!),绝对不值得。 很高兴知道,感谢链接。显然,情况并非如此 简单,但仍然可能,如果你 拥有Windows Mobile 5.0或更高版本。
答案 2 :(得分:0)
那里有一个codeplex site似乎可以为您提供繁重的com interop:
答案 3 :(得分:0)
我接受此代码并添加此
device.RenderState.AlphaBlendEnable = true;
device.RenderState.AlphaFunction = Compare.Greater;
device.RenderState.AlphaTestEnable = true;
device.RenderState.DestinationBlend = Blend.InvSourceAlpha;
device.RenderState.SourceBlend = Blend.SourceAlpha;
device.RenderState.DiffuseMaterialSource = ColorSource.Material;
在初始化的例程中,它工作得非常好,谢谢
答案 4 :(得分:0)
CE 6.0不支持Alpha混合。 WM 5.0及更高版本可以,但不是通过.NET CF,你需要P / Invoke GDI这样做。那里有现成的解决方案,但是,如果你有兴趣我可以在办公室明天挖出链接。我现在必须使用CE 6.0,所以我没有想到它们。
如果您使用的是CE 6.0,则可以通过保留透明背景颜色(例如ff00ff或类似丑陋的东西)并在图像中使用透明区域来使用伪透明度。然后,您的父控件必须实现一个简单的界面,允许重新绘制子控件的图形缓冲区上的相关部分。请注意,这不会给你一个真正的“alpha通道”,而只是一个难以开启的二进制透明度。
它没有听起来那么糟糕。看一下OpenNETCF ImageButton的初学者。如果您打算使用这种方法,我会对一些简单的控件进行扩展,如果您感兴趣,可以使用这种技术。
另一个缺点是这种技术依赖于实现特殊界面的父控件,以及在绘图中使用它的daugther控件。因此,对于闭源组件(即股票winforms组件),你运气不好。