Альфа-смешение цветов в .NET Compact Framework 2.0

В платформе 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)

Решение

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

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

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

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

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

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

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

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

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

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;

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