Alpha Compact Framework 2.0中的Alpha混合颜色

时间:2008-08-18 12:17:16

标签: c# .net graphics compact-framework

在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上工作?

5 个答案:

答案 0 :(得分:1)

显然,它并不是那么简单,但如果您使用的是Windows Mobile 5.0或更新版本,请still possible

答案 1 :(得分: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组件),你运气不好。

答案 2 :(得分: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;

在初始化的例程中,它工作得非常好,谢谢

答案 3 :(得分:0)

  

显然,情况并非如此   简单,但仍然可能,如果你   拥有Windows Mobile 5.0或更高版本。

哇...如果我必须把所有代码放进去(并且做本机互操作!),绝对不值得。 很高兴知道,感谢链接。

答案 4 :(得分:0)

那里有一个codeplex site似乎可以为您提供繁重的com interop: