Pergunta

No framework Full .NET você pode usar o método Color.FromArgb() para criar uma nova cor com mesclagem alfa, assim:

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

ou

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

No entanto, no Compact Framework (2.0 especificamente), nenhum desses métodos está disponível, você só obtém:

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

e

Color.FromArgb(int val);

O primeiro, obviamente, nem permite inserir um valor alfa, mas a documentação do último mostra que "val" é um valor ARGB de 32 bits (como 0xAARRGGBB em oposição ao 0xRRGGBB padrão de 24 bits), então faria sentido que você poderia simplesmente construir o valor ARGB e passá-lo para a função.Eu tentei isso com o seguinte:

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

Mas não importa o que eu faça, a mistura alfa nunca funciona, a cor resultante sempre tem opacidade total, mesmo quando o valor alfa é definido como 0.

Alguém conseguiu que isso funcionasse no Compact Framework?

Foi útil?

Solução

Aparentemente, não é tão simples assim, mas ainda é possível, se você tiver o Windows Mobile 5.0 ou mais recente.

Outras dicas

Aparentemente, não é tão simples, mas ainda possível, se você tiver o Windows Mobile 5.0 ou mais recente.

Uau ... definitivamente não vale a pena se eu tiver que colocar todo esse código (e fazer interoperamento nativo!) É bom saber, porém, obrigado pelo link.

Existe um site codeplex por aí que parece fazer o trabalho pesado da interoperabilidade de comunicação para você:

eu pego esse código e adiciono isso

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;

na rotina inicializada e funcionou muito bem, obrigado

CE 6.0 não oferece suporte à combinação alfa.WM 5.0 e superior fazem isso, mas não por meio do .NET CF, você precisará P/Invoke GDI para fazer isso.Existem soluções prontas por aí, no entanto, se você estiver interessado, posso desenterrar os links amanhã no escritório.Eu tenho que trabalhar com o CE 6.0 atualmente, então não os tenho em mente.

Se você estiver usando o CE 6.0, poderá usar a pseudotransparência reservando uma cor de fundo de transparência (por exemplo,ff00ff ou algo similarmente feio) e usar isso em suas imagens para áreas transparentes.Em seguida, seus controles pai devem implementar uma interface simples que permita redesenhar a parte relevante no buffer gráfico de seus controles filhos.Observe que isso não fornecerá um verdadeiro "canal alfa", mas apenas um tipo de transparência binária liga-desliga.

Não é tão ruim quanto parece.Dê uma olhada no OpenNETCF ImageButton para começar.Se você for usar esse método, tenho uma versão um tanto estendida de alguns controles simples com essa técnica disponível, se você estiver interessado.

Uma desvantagem adicional é que essa técnica depende do controle pai implementar uma interface especial e dos controles filhos usá-la no desenho.O mesmo ocorre com componentes de código fechado (ou seja,também os componentes do estoque do winforms) você está sem sorte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top