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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 590
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Видимо, не все так просто, но все еще возможно, если у вас 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 делает поддерживает альфа-смешивание. Может случиться так, что в вашей конкретной сборке ОС нет, но поддержка есть в ОС и может быть включена в образ ОС.

ctacke 19.06.2012 06:35

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