Windows Aero: Welche Farbe muss angemalt werden, damit „Glas“ angezeigt wird?

Welche Farbe muss ich im Kundenbereich malen, um zu machenGlas erscheinen?

Ich habe den Rahmen meines Formulars in den Kundenbereich erweitert:

DwmExtendFrameIntoClientArea(self.Handle, margins);

Ich kann keine offizielle Dokumentation von Microsoft findenFarbe und / oderAlpha Der DWM sucht nach Ersatz durch Glas. Die Dokumentation aufDwmExtendFrameInClientArea erwähnt nicht einmal, dass eine benutzerdefinierte Farbe erforderlich ist. Es gibt nur Hörensagen und Mythen, dass sogar eine spezielle Farbe erforderlich ist.

Der nächste Punkt, den ich finden kann, ist ein Thema in MSDN:

Benutzerdefinierter Fensterrahmen mit DWM

Damit die erweiterten Frames sichtbar sind, müssen die Bereiche, die den Seiten der erweiterten Frames zugrunde liegen, Pixeldaten mit dem Alpha-Wert 0 enthalten.

Aktualisieren: Und ein Blogbeitrag:

Windows Vista für Entwickler - Teil 3 - Der Desktop Window Manager

Es kommt also vor, dass das Bitmuster für RGB-Schwarz (0x00000000) mit dem Bitmuster für 100% transparentes ARGB identisch ist. Sie können also tatsächlich mit einem „schwarzen“ GDI-Pinsel zeichnen und davon ausgehen, dass Sie den DWM angewiesen haben, den gezeichneten Bereich zu verwischen. Das Ergebnis ist der gewünschte Glaseffekt.

Wenn ich nehme, was sie wörtlich sagen (Pixeldaten mit einem Alpha-Wert von Null) konstruiere ich eine Farbe mit null Alpha und male diese in den erweiterten Bereich:

Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

Der Glaseffekt tritt jedoch nicht auf:

Alternativtext http://i46.tinypic.com/anlmd4.png

Wenn ich das zitierte MSDN-Thema ignoriere und stattdessen vollständig undurchsichtiges Schwarz (anstatt eines vollständig transparenten Schwarzes) verwende:

Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b)
e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle);

Der Glaseffekt erscheint:

Alternativtext http://i45.tinypic.com/2ug2ias.png

Ich werde dann dazu gebracht, das zu glaubenundurchsichtiges Schwarz ist der Pixelwert, nach dem der DWM sucht, um ihn durch Glas zu ersetzen.

Aber wie male ich dann?schwarze Gegenstände auf der Glasfläche?

Ich habe getestet, ein Schwarz zu malenRechteck auf der Glasfläche mit aKreis Daneben. Seltsamerweise das Rechtecknicht erscheinen, während der Kreis erscheint; beide haben die gleiche Farbe:

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

Alternativtext http://i49.tinypic.com/aayykk.png

Also, was in aller Welt ist los? Was ist derrichtig Farbe zum Malen im erweiterten Rahmenbereich, damit Glas erscheint?

Update 2

VerwendenAdisak's Vorschlag, genau zu isolieren, wo die Dummheit von Aero lebt, hier zeichne ich ein schwarzes Rechteck innerhalb des schwarzen Kreises:

Alternativtext http://i47.tinypic.com/5dw861.png

Unterstützt FillEllipse das Zeichnen schwarzer Kreise nicht?

Update 3

Pondidum fragte mich, ob ich anriefGraphics.Clear mit einertransparent schwarz Farbe würde das Glas sichtbar machen:

e.Graphics.Clear(Color.FromArgb(0,0,0,0));

Estut Arbeiten, aber Sie können immer noch keine undurchsichtigen schwarzen Gegenstände auf das Glas zeichnen:

Alternativtext http://i47.tinypic.com/5dw861.png

Update 4

AnschauenMicrosoft Vista Bridge Library (Verwaltete Wrapper für Vista-Funktionen, die nicht zu .NET hinzugefügt werden). Sie schaffen es immer nur, einen erweiterten Glasrahmen für WPF-Formulare zu verwenden, nicht für WinForms.

Siehe auchAero: Wie zeichnet man ClearType-Text auf Glas?Aero: Wie zeichnet man Uni-Farben auf Glas?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage