Альфа-смешение цветов в .NET Compact Framework 2.0 - PullRequest
2 голосов
/ 18 августа 2008

В платформе Full .NET вы можете использовать метод Color.FromArgb () для создания нового цвета с альфа-смешиванием, например:

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);

Первый, очевидно, даже не позволяет вводить альфа-значение, но документация для последнего показывает, что «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);
}

Но что бы я ни делал, альфа-смешение никогда не работает, результирующий цвет всегда с полной непрозрачностью, даже при установке значения альфа на 0.

Кто-нибудь заставил это работать на Compact Framework?

Ответы [ 5 ]

1 голос
/ 18 августа 2008

Очевидно, это не так просто, но все еще возможно , если у вас Windows Mobile 5.0 или новее.

0 голосов
/ 19 июня 2012

CE 6.0 не поддерживает альфа-смешение. WM 5.0 и выше, но не через .NET CF, вам потребуется P / Invoke GDI для этого. Есть готовые решения, однако, если вы заинтересованы, я могу найти ссылки завтра в офисе. В настоящее время мне приходится работать с CE 6.0, поэтому я не думаю о них.

Если вы используете CE 6.0, вы можете использовать псевдопрозрачность, сохранив цвет фона прозрачности (например, ff00ff или что-то похожее некрасивое) и используя его в своих изображениях для прозрачных областей. Затем ваши родительские элементы управления должны реализовать простой интерфейс, который позволяет перерисовывать соответствующую часть в графическом буфере дочерних элементов управления. Обратите внимание, что это не даст вам истинный «альфа-канал», а скорее просто жесткую бинарную разновидность прозрачности.

Это не так плохо, как кажется. Взгляните на OpenNETCF ImageButton для начинающих. Если вы собираетесь использовать этот метод, у меня есть несколько расширенная версия некоторых простых элементов управления с этой техникой, если вам интересно.

Еще один недостаток заключается в том, что этот метод основывается на родительском элементе управления, реализующем специальный интерфейс, а дочерний элемент управления использует его на чертеже. Таким образом, с компонентами с закрытым исходным кодом (то есть также со стандартными компонентами winforms) вам не повезло.

0 голосов
/ 20 мая 2010

я беру этот код и добавляю

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;

в инициализированной подпрограмме, и она работает очень хорошо, спасибо

0 голосов
/ 14 октября 2008

Существует сайт codeplex , который, кажется, делает тяжелую работу по взаимодействию для вас:

0 голосов
/ 18 августа 2008

Видимо, это не совсем так просто, но все же возможно, если вы Windows Mobile 5.0 или новее.

Ух ты ... определенно не стоит, если мне придется поместить весь этот код (и сделать нативное взаимодействие!) Полезно знать, хотя, спасибо за ссылку.

...