Windows Aero: Какой цвет краски для создания "стекла"?
Какого цвета я должен рисовать в клиентской области, чтобы стекло появилось?
Я расширил рамку моей формы в клиентскую область, используя:
DwmExtendFrameIntoClientArea(self.Handle, margins);
Я не могу найти официальную документацию от Microsoft о том, какой цвет и/или альфа DWM будет искать для замены на стекло. В документации по DwmExtendFrameInClientArea даже не упоминается, что требуется специальный цвет. Есть только слухи и миф о том, что особый цвет даже требуется.
Ближайшая тема, которую я могу найти - это тема на MSDN:
Чтобы расширенные кадры были видны, области, лежащие под каждой из сторон расширенного кадра, должны иметь данные пикселей, которые имеют альфа-значение 0.
Обновление: и сообщение в блоге:
Бывает, что битовая комбинация для черного RGB (0x00000000) такая же, как битовая комбинация для 100% прозрачного ARGB, поэтому вы можете рисовать "черной" кистью GDI и, если вы дали команду DWM размывать окрашенную область, результат будет желаемый эффект стекла.
Если я беру буквально то, что они говорят (данные пикселей с нулевым альфа-значением), я создаю цвет с нулевым альфа-каналом и закрашиваю его в расширенной области:
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
но эффект стекла не появляется:
![alt text]()
Если я игнорирую цитируемую тему MSDN и вместо этого использую полностью непрозрачный черный (а не полностью прозрачный черный):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
эффект стекла действительно появляется:
![alt text]()
Затем я полагаю, что непрозрачный черный - это значение пикселя, которое DWM будет искать для замены на стекло.
Но тогда как я могу нарисовать черные предметы на стекле?
Я тестировал рисование черного прямоугольника на стеклянной области с кружком рядом с ним. Как ни странно, прямоугольник не появляется, а круг появляется; оба одинакового цвета:
Brush b = new SolidBrush(Color.FromArgb(255, 0, 0, 0));
e.Graphics.FillRectangle(b, 11, 11, 32, 32);
e.Graphcis.FillEllipse(b, 43, 11, 32, 32);
![alt text]()
Так что же происходит в мире? Что такое правильный цвет покрасить в расширенной области кадра, чтобы сделать стекло появляется?
Обновление 2
Используя предложение Adisak, чтобы точно определить, где живет глупость Aero, я рисую черный прямоугольник внутри черного круга:
![alt text]()
Разве FillEllipse не поддерживает рисование черных кругов?
Обновление 3
Пондидум подумал, что если вызвать Graphics.Clear с прозрачным черным цветом, стекло станет видимым:
e.Graphics.Clear(Color.FromArgb(0,0,0,0));
Это действительно работает, но вы до сих пор не можете сделать непрозрачные черные элементы на стекле:
![alt text]()
Обновление 4
Взглянув на библиотеку Microsoft Vista Bridge (управляемые оболочки вокруг функциональности Vista, которые не будут добавлены в .NET), им только удастся получить расширенную стеклянную раму, работающую с формами WPF, а не с WinForms.
Смотрите также
Ответы
Ответ 1
Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
Это на самом деле довольно забавно. Это означает, что вы рисуете что-то совершенно прозрачное, так что это абсолютно ничего не меняет!: -)
Предположим: если черный (0,0,0) должен означать "стекло", как насчет рисования (1,1,1), чтобы получить (почти) черный?
Ответ 2
В одном из сообщений сообщений в блоге, о которых вы говорили выше, есть дискуссия об этом. Нативным решением было использование SetLayeredWindowAttributes
для переключения цветового ключа от черного.
Ответ 3
Попробуйте настроить TransparencyKey формы на Color.FromArgb(1,1,1) (или какое-либо другое подходящее значение по вашему выбору), а затем установите обратную цветную форму (или часть, которую вы хотите стать стеклом), на эту одинаковое значение.
То, как я получил его, чтобы работать без него, делая весь мой черный текст прозрачным/стеклянным.
Я никогда не мог понять, как рисовать "светящийся" текст на стекле. У него всегда был черный прямоугольник.