Подтвердить что ты не робот

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);

но эффект стекла не появляется:

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.

Смотрите также

4b9b3361

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

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

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