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





Видимо, не все так просто, но все еще возможно, если у вас Windows Mobile 5.0 или новее.
Apparently, it's not quite that simple, but still possible, if you have Windows Mobile 5.0 or newer.
Вау ... определенно не стоит, если мне придется вставить весь этот код (и сделать нативное взаимодействие!) Но это полезно знать, спасибо за ссылку.
Существует сайт codeplex, который, кажется, делает за вас тяжелую работу по com-взаимодействию:
я беру этот код и добавляю это
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;
в инициализированной программе, и она работает очень хорошо, спасибо
CE 6.0 не поддерживает альфа-смешение. WM 5.0 и более поздние версии работают, но не через .NET CF, для этого вам потребуется P / Invoke GDI. Есть уже готовые решения, но если интересно, могу завтра в офисе откопать ссылки. В настоящее время мне приходится работать с CE 6.0, поэтому я не думаю о них.
Если вы используете CE 6.0, вы можете использовать псевдопрозрачность, зарезервировав цвет фона прозрачности (например, ff00ff или что-то подобное уродливое) и используя его в ваших изображениях для прозрачных областей. Затем родительские элементы управления должны реализовывать простой интерфейс, позволяющий повторно рисовать соответствующую часть графического буфера дочерних элементов управления. Обратите внимание, что это не даст вам истинного «альфа-канала», а скорее даст вам жесткое включение-выключение бинарной прозрачности.
Это не так плохо, как кажется. Взгляните на OpenNETCF ImageButton для начала. Если вы собираетесь использовать этот метод, у меня есть несколько расширенная версия некоторых простых элементов управления с этой техникой, если вам интересно.
Еще один недостаток заключается в том, что этот метод полагается на родительский элемент управления, реализующий специальный интерфейс, и другие элементы управления, использующие его при рисовании. Таким образом, с компонентами с закрытым исходным кодом (то есть со стандартными компонентами winforms) вам не повезло.
CE 6.0 делает поддерживает альфа-смешивание. Может случиться так, что в вашей конкретной сборке ОС нет, но поддержка есть в ОС и может быть включена в образ ОС.