Вопрос

В полной среде .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 или новее.

Другие советы

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

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

Существует сайт 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) вам не повезло.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top