Какого цвета я должен рисовать в клиентской области, чтобы стекло появилось?
Я расширил рамку моей формы в клиентскую область, используя:
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);
но эффект стекла не появляется:
Если я игнорирую цитируемую тему MSDN и вместо этого использую полностью непрозрачный черный (а не полностью прозрачный черный):
Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);
эффект стекла действительно появляется:
Затем я полагаю, что непрозрачный черный - это значение пикселя, которое 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);
Так что же происходит в мире? Что такое правильный цвет покрасить в расширенной области кадра, чтобы сделать стекло появляется?
Обновление 2
Используя предложение Adisak, чтобы точно определить, где живет глупость Aero, я рисую черный прямоугольник внутри черного круга:
Разве FillEllipse не поддерживает рисование черных кругов?
Обновление 3
Пондидум подумал, что если вызвать Graphics.Clear с прозрачным черным цветом, стекло станет видимым:
e.Graphics.Clear(Color.FromArgb(0,0,0,0));
Это действительно работает, но вы до сих пор не можете сделать непрозрачные черные элементы на стекле:
Обновление 4
Взглянув на библиотеку Microsoft Vista Bridge (управляемые оболочки вокруг функциональности Vista, которые не будут добавлены в .NET), им только удастся получить расширенную стеклянную раму, работающую с формами WPF, а не с WinForms.