Альфа-смешение цветов в.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 или новее.
Существует сайт Codeplex, который, кажется, делает тяжелую работу по взаимодействию для вас:
По-видимому, это не так просто, но все же возможно, если у вас Windows Mobile 5.0 или новее.
Ух ты... определенно не стоит, если мне придется поместить весь этот код (и сделать нативное взаимодействие!). Хорошо бы знать, хотя, спасибо за ссылку.
Я беру этот код и добавляю
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) вам не повезло.