Windows Aero: какого цвета рисовать, чтобы "стекло" появлялось?
Какого цвета я должен рисовать в клиентской области, чтобы стекло появилось?
Я расширил рамку моей формы в клиентскую область, используя:
DwmExtendFrameIntoClientArea(self.Handle, margins);
Я не могу найти официальную документацию от Microsoft о том, какой цвет и / или альфа DWM будет искать для замены на стекло. В документации по DwmExtendFrameInClientArea даже не упоминается, что требуется специальный цвет. Есть только слухи и мифы о том, что требуется особый цвет.
Ближайшая тема, которую я могу найти - это тема на MSDN:
Пользовательская оконная рама с использованием DWM
Чтобы расширенные кадры были видны, области, лежащие под каждой из сторон расширенного кадра, должны иметь пиксельные данные, которые имеют альфа-значение 0.
Обновление: и сообщение в блоге:
Windows Vista для разработчиков. Часть 3. Диспетчер окон рабочего стола
Бывает, что битовый шаблон для черного цвета 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);
но эффект стекла не появляется:
http://i46.tinypic.com/anlmd4.png
Если я игнорирую цитируемую тему MSDN и вместо этого использую полностью непрозрачный черный (а не полностью прозрачный черный):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
эффект стекла действительно появляется:
http://i45.tinypic.com/2ug2ias.png
Затем я полагаю, что непрозрачный черный - это значение пикселя, которое 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);
http://i49.tinypic.com/aayykk.png
Так что же происходит в мире? Какого цвета рисовать в расширенной области рамки, чтобы сделать стекло видимым?
Обновление 2
Используя предложение Adisak, чтобы точно Adisak, где живет глупость Аэро, я рисую черный прямоугольник внутри черного круга:
http://i47.tinypic.com/5dw861.png
Разве FillEllipse не поддерживает рисование черных кругов?
Обновление 3
Pondidum подумал, что если вызвать Graphics.Clear с прозрачным черным цветом, стекло станет видимым:
e.Graphics.Clear(Color.FromArgb(0,0,0,0));
Это работает, но вы все еще не можете нарисовать непрозрачные черные предметы на стекле:
http://i47.tinypic.com/5dw861.png
Обновление 4
Если посмотреть на библиотеку Microsoft Vista Bridge (управляемые оболочки вокруг функциональности Vista, которые не будут добавлены в.NET), им только удастся получить расширенную стеклянную раму, работающую с формами WPF, а не с WinForms.
Смотрите также
3 ответа
Одна из публикаций в блоге, на которую вы ссылались выше, обсуждает это. Нативное решение было использовать SetLayeredWindowAttributes
переключить цветовой ключ от черного.
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), чтобы получить (почти) черный цвет?
Попробуйте установить для TransparencyKey формы значение Color.FromArgb(1,1,1) (или другое подходящее значение по вашему выбору), а затем установить задний цвет формы (или части, которой вы хотите быть стекло) на то же значение.
Вот так я заставил его работать, не делая весь мой черный текст прозрачным / стеклянным.
Я никогда не мог понять, как нарисовать "светящийся" текст на стекле, хотя. За ним всегда был черный прямоугольник.