2010-04-19 3 views
5

In meiner Anwendung habe ich ein Formular, das ich mithilfe der DWM-API-Methode DwmExtendFrameIntoClientArea optimieren, um die Höhe der Aero Glass Titelleiste zu erweitern, so dass ein Teil meines Formulars Clientbereich gezeichnet wird auf dem Aero-Rahmen. Um diesen Effekt zu erzielen, zeichne ich auch auf dem Teil des Kundenbereichs, der über dem Glasrahmen liegt, ein schwarzes Rechteck, so dass es transparent erscheint, wie viele Online-Artikel vermuten lassen. Das funktionierte unter Windows Vista/Windows 7 ziemlich gut, aber als ich VS 2010 heruntergeladen und das .NET Framework 4.0 als mein Framework zum Erstellen meiner Anwendung verwendet hatte, funktionierte dieser Ansatz nicht mehr. Das Problem ist, dass das schwarze Rechteck sichtbar ist, d. H. Die schwarze Farbe wird nicht länger als transparent angesehen, wenn auf Aero-Glas gezeichnet wird. Hat jemand eine Idee, was daran falsch sein könnte und wie es überwunden werden kann?.NET Framework 4.0 und Zeichnung Aero Glass Ausgabe

+0

Aero Glas funktioniert unter Windows 7? Ich denke, das funktioniert nur mit DWM unter Windows Vista. – Svisstack

+2

@Svisstack: Ja; Aero Glass funktioniert unter Windows 7. – SLaks

+0

Ja, es funktioniert. Was nicht funktioniert, ist, es so zu nutzen, wie ich es bei früheren .NET-Versionen getan habe (<4.0) – WorldIntruder

Antwort

0

Verzeihen Sie mir, wenn das nicht hilfreich ist, aber ist es möglich, dass sie einfach ihre Farbpalette geändert haben? Sehr oft scheint es, dass diese Windows-Interop-APIs neben ihrer Standardpalette auch PBGRA-Paletten verwenden können, und es ist möglich, dass sich ihre Standardfarbpalette von einer Framework-Version zu einer anderen geändert hat. Es sollte einfach genug sein, um zu testen, ob das stimmt oder nicht.

(Ich fand ein ähnliches Problem mit Rendering-Hardware-Cursor, wo transparent und schwarz unter bestimmten Umständen verwirrt werden würde. Es stellte sich schließlich heraus, dass ich die PBGRA falsch berechnete, so dass eine der BGR größer als A war Seien Sie wahr für Ihren Hintergrund, der für transparente Farbe gedacht ist.)

Es gibt andere Komplikationen bei der Verwendung der DWM-API-Methode. Ich bin mir nicht ganz sicher, aber aus dem Gedächtnis gibt es etwas Kompliziertes mit den neuen Rändern - wenn ich mich recht erinnere, mussten alle dasselbe Zeichen (+/-) oder Artefakte (wie dein plötzlich erscheinender schwarzer Hintergrund) haben manchmal erschien.

1

Die Antwort auf diese Frage wird hier beschrieben: http://msdn.microsoft.com/en-us/magazine/cc163435.aspx#S6 mit Lösungen für C#.

Auszug aus der gelinkten Seite (falls der Link ist unten):

unter Verwendung von Glas als Hintergrund auf Ihrem Fenster ist ein bisschen schwierig. Wenn Sie etwas natürlich Opaque (z. B. GDI-Funktionen) rendern, erhalten Sie Ihr Objekt auf Glas gerendert, obwohl manchmal mit unerwarteten Ergebnissen. Wenn Sie das Rendern in die Glasoberfläche integrieren möchten, müssen Sie die Funktionen nutzen, die den Alphakanal der Farben verwenden, z. B. GDI +, Windows Presentation Foundation oder die Windows XP-Design-API.

Ein besonderes Problem ist, dass das Rendern eines GDI-Elements in Schwarz das Bitmuster 0x00000000 verwendet - was auch ein vollständig transparentes Schwarz ist, wenn Sie einen Alpha-Kanal verwenden. Wenn Sie also mit einem schwarzen GDI-Pinsel oder -Stift zeichnen, erhalten Sie eine transparente und keine schwarze Farbe. Das größte Problem dabei ist, wenn Sie versuchen, die Standardtextfarbe in einem Steuerelement einer Textbeschriftung zu verwenden, die sich auf dem Glasbereich befindet. Da die Standardtextfarbe normalerweise schwarz ist, wird dies vom DWM als transparent angesehen und der Text wird falsch in das Glas geschrieben.

Und die Lösung für WinForms:

Glücklicherweise gibt es eine Reihe von Möglichkeiten, um dieses Problem. Das Verwenden von Steuerelementen für den Besitzer ist eins. Rendering zu einer Bitmap, die einen Alpha-Kanal hat, ist ein anderer. Glücklicherweise ist es am einfachsten, wenn Sie Text auf Steuerelementen erhalten, indem Sie das .NET Framework 2.0 GDI + für Sie verwenden lassen. Dies wird einfach erreicht, indem Sie die UseCompatibleTextRendering-Eigenschaft für Ihre Steuerelemente festlegen. Standardmäßig ist diese Eigenschaft auf "false" festgelegt, sodass Steuerelemente, die für frühere Versionen von .NET Framework geschrieben wurden, identisch dargestellt werden. Aber wenn Sie es auf "True" setzen, wird Ihr Text korrekt angezeigt.Sie können die Eigenschaft global mit der Application.SetUseCompatibleTextRenderingDefault-Methode festlegen. Wenn Sie Visual Studio® 2005 verwenden, enthält der Vorlagencode einen Aufruf, um das kompatible Text-Rendering in der Hauptroutine auf "Falsch" zu setzen, bevor das Formular erstellt wird. Sie können dies einfach bearbeiten, um es wie unten gezeigt auf wahr zu setzen und alle Ihre Kontrollen werden korrekt aussehen, wenn sie in ein Glasfenster geschrieben werden.

static void Main() 
{ 
    Application.EnableVisualStyles(); 

    Application.SetCompatibleTextRenderingDefault(true); // this line fixes an issue 

    Application.Run(new GlassForm()); 
}