Альфа-смешение цветов в.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) вам не повезло.

Другие вопросы по тегам