C# .NET Compact Framework 2.0中的Alpha混合颜色

C# .NET Compact Framework 2.0中的Alpha混合颜色,c#,.net,graphics,compact-framework,C#,.net,Graphics,Compact Framework,在完整的.NET framework中,您可以使用Color.FromArgb()方法通过alpha混合创建新颜色,如下所示: Color blended = Color.FromArgb(alpha, color); 或 但是,在Compact Framework(特别是2.0)中,这两种方法都不可用,您只能得到: Color.FromArgb(int red, int green, int blue); 及 显然,第一个函数甚至不允许您输入alpha值,但后者的文档显示“val”是32位

在完整的.NET framework中,您可以使用Color.FromArgb()方法通过alpha混合创建新颜色,如下所示:

Color blended = Color.FromArgb(alpha, color);

但是,在Compact Framework(特别是2.0)中,这两种方法都不可用,您只能得到:

Color.FromArgb(int red, int green, int blue);

显然,第一个函数甚至不允许您输入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);
}
来自argb的私有颜色(字节alpha、字节红色、字节绿色、字节蓝色) {
int val=(alpha显然,这并没有那么简单,但是,如果您使用的是Windows Mobile 5.0或更高版本


显然,情况并非如此 很简单,但仍然可能,如果你 使用Windows Mobile 5.0或更新版本

哇……如果我必须把所有的代码都放进去(并进行本机互操作),那绝对不值得
很高兴知道,谢谢你的链接。

有一个网站似乎为你完成了com互操作的繁重任务:

我接受了这段代码并添加了这段代码

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;

在初始化的例程中,它工作得很好,谢谢你,CE 6.0不支持alpha混合。WM 5.0和更高版本支持,但不是通过.NET CF,你需要调用GDI来实现。那里有现成的解决方案,但是,如果你感兴趣,我可以明天在办公室挖掘链接。我必须与CE合作目前是6.0,所以我没有想到它们

如果您使用的是CE 6.0,则可以通过保留透明背景色(例如ff00ff或类似的丑陋颜色)来使用伪透明然后,您的父控件必须实现一个简单的界面,允许在子控件的图形缓冲区中重新绘制相关部分。请注意,这不会为您提供真正的“alpha通道”,而只是一种硬开关二进制透明度

这并不像听起来那么糟糕。先看看OpenNETCF ImageButton。如果你打算使用这种方法,如果你感兴趣的话,我有一些简单控件的扩展版本

另一个缺点是,这种技术依赖于实现特殊接口的父控件,以及在绘图中使用该接口的子控件。因此,对于封闭源组件(即库存winforms组件)您运气不好。

CE 6.0确实支持alpha混合。可能是您的特定操作系统版本不支持alpha混合,但支持存在于操作系统中,可以包含在操作系统映像中。
private Color FromARGB(byte alpha, byte red, byte green, byte blue)
{
    int val = (alpha << 24) | (red << 16) | (green << 8) | blue;
    return Color.FromArgb(val);
}
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;