Vista/7: Как получить цвет стекла?
Как вы используете DwmGetColorizationColor
?
Документация говорит, что возвращает два значения:
- 32-битный
0xAARRGGBB
содержащий цвет, используемый для состава стекла - логический параметр, который имеет значение true, "если цвет является непрозрачной смесью" (что бы это ни значило)
Вот цвет, который мне нравится, хороший зеленый оттенок:
Вы можете заметить, что цвет зеленый, и полупрозрачная строка заголовка (на белом фоне) очень четко показывает цвет соплей:
я пытаюсь получить цвет от Windows:
DwmGetColorizationColor(dwCcolorization, bIsOpaqueBlend);
И я получаю
dwColorization: 0x0D0A0F04
bIsOpaqueBlend: false
Согласно документации это значение имеет формат AARRGGBB
и так содержит:
AA: 0x0D (13)
RR: 0x0A (10)
GG: 0x0F (15)
BB: 0x04 (4)
Это предположительно означает, что цвет (10, 15, 4), с непрозрачностью ~5,1%.
Но если вы на самом деле посмотрите на это значение RGB, оно совсем близко от моего желаемого сопли зеленого цвета. Вот
- (10, 15, 4) с нулевой непрозрачностью (исходный цвет) и
- (10,15,4) с непрозрачностью 5% на фоне белого / шахматной доски:
Вместо того, чтобы быть Lime
зеленый, DwmGetColorizationColor
возвращает почти полностью прозрачный черный.
Итак, вопрос: как получить цвет стекла в Windows Vista/7?
я пытался использовать DwmGetColorizationColor
, но это не очень хорошо работает.
Человек с такой же проблемой, но более приятной блестящей картиной, чтобы привлечь вас, белок:
Таким образом, все сводится к тому, что DwmGetColorizationColor совершенно непригоден для приложений, пытающихся применить текущий цвет к непрозрачной поверхности.
я люблю скриншоты этого парня намного лучше чем мой. Используя его скриншоты в качестве шаблона, я сделал еще несколько блесток:
На последних двух скриншотах альфа-микросхема представляет собой настоящий частично прозрачный PNG, который смешивается с фоном вашего браузера. Здорово! (я такой выродок)
Редактировать 2: пришлось расположить их в цвете радуги. (я такой выродок)
Редактировать 3: Ну, теперь я, конечно, должен добавить желтый.
Недокументированные / неподдерживаемые / хрупкие обходные пути
Существует недокументированный экспорт из DwmApi.dll
в точке входа 137, который мы назовем DwmGetColorizationParameters
:
HRESULT GetColorizationParameters_Undocumented(out DWMCOLORIZATIONPARAMS params);
struct DWMCOLORIZATIONPARAMS
{
public UInt32 ColorizationColor;
public UInt32 ColorizationAfterglow;
public UInt32 ColorizationColorBalance;
public UInt32 ColorizationAfterglowBalance;
public UInt32 ColorizationBlurBalance;
public UInt32 ColorizationGlassReflectionIntensity;
public UInt32 ColorizationOpaqueBlend;
}
Нас интересует первый параметр: ColorizationColor
,
Мы также можем прочитать значение из реестра:
HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM
ColorizationColor: REG_DWORD = 0x6614A600
Таким образом, вы выбираете яд для создания проблем с appcompat. Вы можете
- полагаться на недокументированный API (который плохой, плохой, плохой и может исчезнуть в любое время)
- использовать недокументированный ключ реестра (что также плохо, и может уйти в любое время)
Смотрите также
- Есть ли список допустимых комбинаций параметров для API GetThemeColor / Visual Styles
- Как Windows меняет цвет Aero Glass?
- DWM - цветовая обработка цвета с использованием DWMGetColorizationColor
- Получение базового цвета Aero Glass для рендеринга непрозрачной поверхности
Я хотел задать этот вопрос уже больше года. я всегда знал, что невозможно ответить, и что единственный способ заставить кого-то обратить внимание - это сделать красочные скриншоты; разработчиков привлекают блестящие вещи. Но с другой стороны это означает, что я должен был приложить все усилия для изготовления приманок.
3 ответа
Цвет раскраски!= Выбранный базовый цвет. Это вводит в заблуждение, я знаю.
Но я в замешательстве. Изображение, которое вы позаимствовали, было из моего поста, озаглавленного " Получение основного цвета Aero Glass для рендеринга непрозрачной поверхности". Разве это не то, что вы хотите сделать? Я также указал в сообщении местоположение реестра, в котором хранится вся информация о цвете (HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM) для поисковых целей.
Отредактировано 8/26
DwmGetColorizationColor (dwmapi.dll) возвращает "цвет окраски", который представляет собой смесь различных цветов (включая выбранный вами базовый цвет) и шейдерной логики для достижения общего эффекта стекла.
Всю необходимую информацию о цвете можно найти в разделе реестра, указанном выше. Основной цвет, цвета, используемые при смешивании, и результирующий цвет окраски - все это есть.
(Ключ выше присутствует в Windows Vista и выше.)
Я считаю, что я решил Aero Color. Цвет, заданный ColorizationColor, на самом деле является AARRGGBB, но он не используется так, как вы думаете. И чтобы решить окончательный цвет, вам также нужно получить интенсивность цвета, как показано здесь: http://www.codeproject.com/Articles/610909/Changing-Windows-Aero-Color
Первый шаг - разобрать AARRGGBB. Затем возьмите полученный RGB и конвертируйте в HSV. Чистый оттенок плюс насыщенность при полной яркости - это основной цвет. Теперь наложите Value в оттенках серого на Alpha поверх чистого Hue и Saturation, чтобы получить цвет Aero. Затем наложите этот цвет поверх цвета рамки: rgb(235, 235, 235) на Intensity, чтобы получить окончательный результат цвета Composite Aero.
Наконец, я также привел пример того, как извлечь полезный цвет панели инструментов, который соответствует цвету рамки Aero, но всегда будет работать с черным текстом и другими основными функциями Aero. Это достигается путем ограничения интенсивности до 35%.
Вот математика:
function dwmToRgb() {
// Input Values
var colorizationColor = "a84f1b1b"; // dwmcolor.clrColor = ColorizationColor
var colorizationColorBalance = 60; // dwmcolor.nIntensity = ColorizationColorBalance
var F = 235; // Frame base grayscale color when Transparency is disabled
// Parse the input values
var A = Math.round(parseInt(colorizationColor.substr(0,2),16)/2.55)/100;
var R1 = parseInt(colorizationColor.substr(2,2), 16);
var G1 = parseInt(colorizationColor.substr(4,2), 16);
var B1 = parseInt(colorizationColor.substr(6,2), 16);
var I = colorizationColorBalance/100;
// Solve for HSV Value and pure Hue+Sat
var V = Math.max(R1, G1, B1);
var R2 = R1*255/V;
var G2 = G1*255/V;
var B2 = B1*255/V;
// Aero Frame Pure Hue: Overlay Value @ Alpha over pure Hue+Sat
var R3 = Math.round(V+(R2-V)-((R2-V)*A));
var G3 = Math.round(V+(G2-V)-((G2-V)*A));
var B3 = Math.round(V+(B2-V)-((B2-V)*A));
var hexRGB3 = "#" + ((1 << 24) + (R3 << 16) + (G3 << 8) + B3).toString(16).slice(1);
// Aero Frame Composite Color: Overlay RGB3 @ Intensity over Frame base color
var R4 = Math.round(R3+(F-R3)-((F-R3)*I));
var G4 = Math.round(G3+(F-G3)-((F-G3)*I));
var B4 = Math.round(B3+(F-B3)-((F-B3)*I));
var hexRGB4 = "#" + ((1 << 24) + (R4 << 16) + (G4 << 8) + B4).toString(16).slice(1);
// Aero Toolbar Color: Overlay RGB3 @ max 35% Intensity over Frame base color
if (I > 0.35) { I5 = 0.35;} else { I5 = I;}
var R5 = Math.round(R3+(F-R3)-((F-R3)*I5));
var G5 = Math.round(G3+(F-G3)-((F-G3)*I5));
var B5 = Math.round(B3+(F-B3)-((F-B3)*I5));
var hexRGB5 = "#" + ((1 << 24) + (R5 << 16) + (G5 << 8) + B5).toString(16).slice(1);
Как выглядит A0F040 для вас?
OP Edit: вот как мне выглядит 0xA0F040: