2

在完整的 .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 值(作为 0xAARRGGBB,而不是标准的 24 位 0xRRGGBB),所以这是有道理的您可以构建 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,生成的颜色也总是完全不透明。

有没有人让它在紧凑框架上工作?

4

5 回答 5

1

显然,如果您有 Windows Mobile 5.0 或更高版本,这不是那么简单,但仍然可能。

于 2008-08-18T12:33:02.273 回答
1

有一个codeplex 站点似乎可以为您完成 com interop 的繁重工作:

于 2008-10-13T23:03:20.513 回答
0

显然,这不是那么简单,但如果您有 Windows Mobile 5.0 或更高版本,它仍然是可能的。

哇...如果我必须将所有代码放入(并进行本机互操作!),这绝对不值得。不过,很高兴知道,感谢您的链接。

于 2008-08-18T12:37:45.557 回答
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;

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

于 2010-05-20T00:36:49.717 回答
0

CE 6.0 不支持 alpha 混合。WM 5.0 及更高版本可以,但不是通过 .NET CF,您需要 P/Invoke GDI 东西才能这样做。那里有现成的解决方案,但是,如果您有兴趣,我明天可以在办公室挖掘链接。我目前必须使用 CE 6.0,所以我没有想到它们。

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

It's not as bad as it sounds. Take a look at the OpenNETCF ImageButton for starters. If you are going to use this method, i have a somewhat extended version of some simple controls with this technique lying around if you are interested.

One additional drawback is that this technique relies on the parent control implementing a special interface, and the daugther controls using it in drawing. So with closed-source components (i.e. also the stock winforms components) you are out of luck.

于 2012-06-18T22:03:05.387 回答