Используя недокументированный SetWindowCompositionAttribute
API в Windows 10, можно включить стекло для окна. Стекло белое или прозрачное, как показано на этом снимке экрана:
Однако в меню "Пуск" Windows 10 и в центре уведомлений, которые оба также используют стекло, сочетаются с цветом акцента, например:
Как это сделать?
Исследования
Цвет акцента в следующих примерах - светло-фиолетовый - вот скриншот из приложения "Настройки":
Структура AccentPolicy, определенная в этом примере кода, имеет состояния акцента, флаги и градиентные цвета:
AccentPolicy = packed record
AccentState: Integer;
AccentFlags: Integer;
GradientColor: Integer;
AnimationId: Integer;
end;
и состояние может иметь любое из этих значений:
ACCENT_ENABLE_GRADIENT = 1;
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2;
ACCENT_ENABLE_BLURBEHIND = 3;
Обратите внимание, что первые два из них были найдены на этот github gist.
Третий отлично работает, что делает стекло. Из двух других,
- ACCENT_ENABLE_GRADIENT выводит окно, полностью серое, независимо от того, что стоит за ним. Отсутствует прозрачность или эффект стекла, но цвет окна, нарисованный, нарисован DWM, а не приложением.
- ACCENT_ENABLE_TRANSPARENTGRADIENT приводит к тому, что окно полностью окрашено цветом акцента, независимо от того, что стоит за ним. Отсутствует прозрачность или эффект стекла, но цвет окна, нарисованный, нарисован DWM, а не приложением.
Итак, это приближается, и похоже, что некоторые из всплывающих окон, таких как апплет тома, используют.
Значения не могут быть объединены вместе, а значение поля GradientColor не имеет эффекта, за исключением того, что оно должно быть отличным от нуля.
При рисовании непосредственно на стеклянном окне появляется очень странное смешение. Здесь он заполняет клиентскую область красным (0x000000FF в формате ABGR):
и любая ненулевая альфа, например 0xAA0000FF, не приводит к отсутствию цвета:
Совместимо с внешним видом меню "Пуск" или "Область уведомлений".
Как эти окна делают это?