Pregunta

En el marco Full .NET, puede utilizar el método Color.FromArgb() para crear un nuevo color con combinación alfa, como este:

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

o

Color blended = Color.FromArgb(alpha, red, green , blue);

Sin embargo, en Compact Framework (2.0 específicamente), ninguno de esos métodos está disponible, solo obtienes:

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

y

Color.FromArgb(int val);

El primero, obviamente, ni siquiera le permite ingresar un valor alfa, pero la documentación para el último muestra que "val" es un valor ARGB de 32 bits (como 0xAARRGGBB en lugar del estándar 0xRRGGBB de 24 bits), por lo que tendría sentido. que podrías simplemente construir el valor ARGB y pasarlo a la función.Probé esto con lo siguiente:

private Color FromARGB(byte alpha, byte red, byte green, byte blue)
{
    int val = (alpha << 24) | (red << 16) | (green << 8) | blue;
    return Color.FromArgb(val);
}

Pero no importa lo que haga, la combinación alfa nunca funciona, el color resultante siempre tiene opacidad total, incluso cuando se establece el valor alfa en 0.

¿Alguien ha conseguido que esto funcione en Compact Framework?

¿Fue útil?

Solución

Aparentemente no es tan simple, pero aun posible, si tienes Windows Mobile 5.0 o posterior.

Otros consejos

Aparentemente, no es tan simple, pero aún posible, si tiene Windows Mobile 5.0 o más nuevo.

Wow ... definitivamente no vale la pena si tengo que poner todo ese código (¡y hacer interopías nativas!) Sin embargo, es bueno saberlo, gracias por el enlace.

Hay un sitio codeplex por ahí que parece hacer el trabajo pesado de la interoperabilidad de comunicaciones por usted:

Tomo este código y agrego esto

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;

en la rutina inicializada y funciona muy bien, gracias

CE 6.0 no admite la combinación alfa.WM 5.0 y superiores lo hacen, pero no a través de .NET CF, necesitará P/Invocar elementos GDI para hacerlo.Existen soluciones listas para usar, sin embargo, si está interesado, puedo buscar los enlaces mañana en la oficina.Actualmente tengo que trabajar con CE 6.0, así que no los tengo en mente.

Si está utilizando CE 6.0, puede utilizar pseudotransparencia reservando un color de fondo de transparencia (p. ej.ff00ff o algo similarmente feo) y usarlo en sus imágenes para áreas transparentes.Luego, sus controles principales deben implementar una interfaz simple que permita volver a dibujar la parte relevante en el búfer de gráficos de sus controles secundarios.Tenga en cuenta que esto no le dará un verdadero "canal alfa", sino más bien un tipo de transparencia binaria de encendido y apagado.

No es tan malo como parece.Eche un vistazo a OpenNETCF ImageButton para empezar.Si vas a utilizar este método, tengo una versión algo extendida de algunos controles simples con esta técnica por si estás interesado.

Un inconveniente adicional es que esta técnica depende de que el control principal implemente una interfaz especial y los controles de la hija la utilicen al dibujar.Lo mismo ocurre con los componentes de código cerrado (es decir,también los componentes originales de winforms) no tienes suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top