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) (или другое подходящее значение по вашему выбору), а затем установить задний цвет формы (или части, которой вы хотите быть стекло) на то же значение.

Вот так я заставил его работать, не делая весь мой черный текст прозрачным / стеклянным.

Я никогда не мог понять, как нарисовать "светящийся" текст на стекле, хотя. За ним всегда был черный прямоугольник.

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