MSDN Magazin > Home > Ausgaben > 2007 > April >  Aero Glass: Erstellen von Spezialeffekten mit d...
Aero Glass
Erstellen von Spezialeffekten mit dem Desktopfenster-Manager
Ron Fosner

Themen in diesem Artikel:
  • Erläuterungen zum Desktopfenster-Manager (DWM)
  • Programmieren des Desktopfenster-Managers
  • Zeichnen auf Glas und Einbinden von Live-Miniaturansichten
In diesem Artikel werden folgende Technologien verwendet:
Windows Vista, .NET Framework
Laden Sie den Code für diesen Artikel herunter: DWM2007_04.exe (166 KB)
Code online durchsuchen
Ich freue mich immer auf neue Veröffentlichungen von Windows. Es macht Spaß, in MSDN® und der SDK-Dokumentation zu stöbern und nach den neuesten Innovationen zu suchen, um sie auszuprobieren und darauf aufzubauen. Damit können Sie Freunde und Mitarbeiter und mit etwas Glück sogar Ihren Arbeitgeber beeindrucken. Windows Vista™ hat in dieser Hinsicht viele tolle Sachen zu bieten. Auf diese Version war ich ganz besonders gespannt, seit ich gehört hatte, dass sie eine 3D/Compositing-Schicht in den Desktop integriert. Ich habe im Lauf der Jahre unzählige 3D-Anwendungen geschrieben und mich immer darüber geärgert, dass ich eine schöne Benutzeroberfläche zwar in einer 3D-Anwendung erstellen konnte, nicht aber in einer anderen Anwendung. Mit Windows Vista und dem Desktopfenster-Manager (DWM) beginnt sich dies allmählich zu ändern (siehe Abbildung 1).
Abbildung 1 DWM ermöglicht Features wie z. B. Flip 3D-Aufgabenumschaltung (Klicken Sie zum Vergrößern auf das Bild)
DWM ist die neue Schnittstelle, die verwaltet, wie die verschiedenen ausgeführten und gerenderten Fenster auf dem Windows Vista-Desktop dargestellt werden. Windows® Presentation Foundation (WPF) stellt eine höhere Schicht bereit, die das Rendern in die Desktopschicht steuert, und das Windows-Anzeigetreibermodell (WDDM) führt in einer tieferen Schicht das eigentliche Rendern in die Anzeige aus. In diesem Artikel wird nur die Verwendung der DWM-Schnittstellen behandelt. Mehr zu diesem Thema erfahren Sie im MSDN-Artikel „Einführung in Windows Presentation Foundation“ von David Chappell (msdn2.microsoft.com/aa663364.aspx). Im Rahmen dieses Artikels sind bei WDDM lediglich die neuen Effekte interessant, die durch DWM-Schnittstellen ermöglicht werden, sowie die Probleme, die mit WDDM behoben werden sollten.

Technischer Überblick über DWM
Die DWM-Schnittstelle, die in allen Versionen von Windows Vista außer in Windows Vista Home Basic verfügbar ist, befindet sich in der Datei dwm.exe. Alle Anwendungen im System profitieren ohne Änderung oder Neukompilierung von DWM. Allerdings können Anwendungen, die bestimmte DWM-Funktionen nutzen möchten, Schnittstellen in der Datei dwmapi.dll (der öffentlichen Schnittstelle von DWM) aufrufen, die danach an dwm.exe übergeben werden. Die Schnittstellendeklarationen befinden sich in der Datei dwmapi.h. Unter windowssdk.msdn.microsoft.com können Sie online aktuelle API-Informationen erhalten.
Windows Vista wurde so konzipiert, dass Grafikbeschleuniger nicht nur für 3D DirectX®-Anwendungen, sondern für jedes Fenster verwendet werden. Zu diesem Zweck kommuniziert DWM mit WDDM, dem eigentlichen Besitzer des Grafikprozessors und des Videospeichers. (DWM verlässt sich bei der Ausgabe und beim Rendern in DirectX auf milcore.dll, eine Komponente, die gemeinsam mit Windows Presentation Foundation genutzt wird.) Das Rendern wird von einem separaten Thread in DWM ausgeführt, auf den der Benutzer keinen Zugriff hat und in dessen Besitz das DirectX-Gerät ist. Zusätzlich besitzen die meisten Anwendungen eigene Threads für das Rendern und die Benutzeroberfläche (beispielsweise den Meldungsverschiebungs-Thread USER in einer typischen Win32®-Anwendung), die aber keinen Konflikt mit dem Render-Thread von DWM verursachen. DWM erhält eine Liste von Fenstern und verwaltet deren Bitmaps in einer Struktur, die anschließend von DWM auf dem endgültigen Desktop zusammensetzt wird. Anders ausgedrückt, rendert jede Anwendung ihre eigenen Bitmaps, die danach von DWM zusammengesetzt werden.
Der Hauptfenster-Thread einer Anwendung rendert die Szene. Der Render-Thread von DWM greift dann auf diese Szene zu und aktualisiert über die DirectX-Schnittstelle den Desktop. Die übergebenen Informationen werden lediglich auf die Änderungen (Deltas) gegenüber den vorherigen Renderdaten komprimiert. Umfangreiche Daten, wie beispielsweise Bilder, werden in freigegebenem Speicher abgelegt. Dadurch wird es u. U. möglich, die Szenengenerierung auf einem bestimmten Computer und das endgültige Rendern auf einem anderen Computer auszuführen. 3D-Programmierer, die mit OpenGL gearbeitet haben, werden mit dieser Architektur vertraut sein. Hierdurch wird einem Server ermöglicht, eine 3D-Szene zu verwalten und lediglich Deltas an die Clientcomputer zu senden. Eine 3D-Szene kann verteilt gerendert und mit voller Hardwarebeschleunigung auf einer beliebigen Anzahl von Clientcomputern ausgeführt werden. Diese Architektur ermöglicht es DWM, für Remotedesktopszenarien eine erstklassige Unterstützung zu bieten.
Windows Vista kann zwar mit einem älteren, mit Windows XP kompatiblen Treiber ausgeführt werden, zur Nutzung aller DWM-Funktionen ist allerdings ein WDDM-Videotreiber erforderlich. Entgegen einiger Spekulationen erfordert DWM nicht DirectX 10, aber es benötigt etwas mehr Video- bzw. Texturspeicher und eine Videokarte, die Shader Model 2.0 oder höher unterstützt. Der größte Unterschied beim WDDM besteht in der Einführung des Videospeichermanagers (VidMM), der Videospeicherzuordnungen zwischen Systemspeicher und Videospeicher austauschen kann. Dies bedeutet, dass WDDM die Ressourcen der Videokarte virtualisieren kann, wodurch eine bessere Freigabe und ein besserer Austausch von Videospeicher sowie ein Kontextwechsel des Grafikprozessors zwischen verschiedenen Threads in ungleichartigen Anwendungen möglich wird. Aufgrund von Treibern, die nicht in der Lage waren, Kontextwechsel zu verarbeiten, war ein stabiles Ausführen mehrerer 3D-Anwendungen fast unmöglich. Außerdem war vor WDDM keine formelle Planung verfügbar, was oft zur Folge hatte, dass eine DirectX-Anwendung anderen DirectX-Anwendungen die Ressourcen nahm. Dank WDDM kommt dies jetzt viel seltener vor. Die Treiber für Windows Vista verhalten sich außerdem erheblich disziplinierter und müssen jetzt wesentlich widerstandsfähiger als bei früheren Windows-Versionen sein.
Beachten Sie übrigens, dass DirectX 10 ein nur für Windows Vista geeignetes API ist. Anwendungen, die für frühere DirectX-Versionen entwickelt wurden, sollen auf einer älteren DirectX-API-Implementierung ausgeführt werden, die DirectX 9 L heißen soll. Dies wird die letzte Version sein, die von Treibern aus der Zeit vor WDDM unterstützt wird. Von DirectX 9 L-Anwendungen wird erwartet, dass sie sowohl unter Windows XP mit installiertem DirectX 9 L als auch unter Windows Vista ausgeführt werden können. DirectX 10 enthält keine älteren Schnittstellen.

Die Vorteile eines Compositing-Desktop
Alle diese neuen Subsysteme geben Ihnen die Möglichkeit, Fenster unabhängig zu rendern und einem Compositing zu unterziehen, bevor Sie sie auf den Desktop rendern. Ein paar schöne Anwendungsbeispiele hierfür sind in Windows Vista und einigen der im Lieferumfang von Windows Vista enthaltenen Anwendungen zu sehen. Zwei Beispiele, deren Verwendung ich Ihnen vorführen werde, sind der Aero™-Glaseffekt und die Miniaturansichten. Der Glaseffekt ist nur dann verfügbar, wenn das Aero Glass-Schema ausgeführt wird und Compositing aktiviert ist. Bei Aero Basic steht er nicht zur Verfügung.
Da jedes Fenster in einem eigenen Abschnitt des Videospeichers erstellt wird, wird das endgültige Compositing des Fensters auf dem Desktop durch DWM vorgenommen. DWM hat also Zugriff auf das Bild auf dem Desktop und kann es mit der Darstellung des Fensters verschmelzen, sodass eine Komposition aus beidem gerendert wird. Dies ist am deutlichsten in allen Bereichen eines Fensters zu erkennen, die mit dem vorhandenen Desktop-Bild verschmolzen werden, um den Effekt von satiniertem Glas zu erzeugen. Da jedes Fenster auf eine Zwischenoberfläche außerhalb der Bildschirmanzeige gerendert wird, ist DWM das einzige Programm, das an der Aktualisierung des Glaseffektes beteiligt ist. Wenn Sie ein Fenster mit Glaseffekt verschieben, muss kein zugrunde liegendes Fenster für ungültig erklärt werden. DWM aktualisiert das sichtbare lichtdurchlässige Bild auf die neuen Koordinaten. DWM kann angewiesen werden, einen Teil des Clientbereichs eines Fensters mit Glas zu rendern. Dadurch können Sie Glasbereiche für den eigenen Gebrauch erstellen.
Dieses Compositing außerhalb der Anzeige macht den Desktop reaktionsfähiger. Da jetzt jedes Fenster separat vom Desktop gerendert wird, ist das Problem beseitigt, das bei Anwendungen mit langsamer Aktualisierung (z. B. Webbrowsern) häufig auftritt. In früheren Windows-Versionen kam es nicht selten vor, dass eine Anzeige wie in Abbildung 2 dargestellt wurde. Wenn Sie ein Fenster über einer anderen Anwendung verschoben haben, konnte es vorkommen, dass dieser Verzerrungseffekt auftrat, weil die Aktualisierung des darunter liegenden Fensters zu lange dauerte. Bei Desktopkomposition tritt dieser Fehler nicht mehr auf.
Abbildung 2 Langsames Rendern führt zu Verzerrungen (Klicken Sie zum Vergrößern auf das Bild)
Einige der im Lieferumfang von Windows Vista enthaltenen Anwendungen nutzen die Möglichkeit, Glas in den Clientbereich zu rendern. Eines der schönsten Beispiele dafür ist der Windows Media® Player, der den Rahmen in den unteren Abschnitt des Clientbereichs ausdehnt, um dort benutzerdefinierte Steuerelemente anzuzeigen. Die Minimalversion sieht wie in Abbildung 3 aus.
Abbildung 3 Glaseffekte im Windows Media Player (Klicken Sie zum Vergrößern auf das Bild)
Wenn ich das Fenster auf meinem Desktop verschiebe, besteht das Bild, das ich durch die Steuerelemente sehen kann, aus dem unter dem Player befindlichen Teil des Desktops. Wenn ich das Fenster über einer Animation verschiebe, kann ich durch das darüber liegende Fenster hindurch die Animation sehen! Genau darin liegt die Stärke eines Compositing-Desktop.
Wenn Sie den Kompositionseffekt ausschalten, erhalten Sie nur den Aurora-Effekt auf dem Fenster. Das Fenster wird dann wie in Abbildung 4 undurchsichtig mit der Standardfensterfarbe gerendert.
Abbildung 4 Windows Media Player mit deaktivierten Glaseffekten (Klicken Sie zum Vergrößern auf das Bild)
Die Schnittstellen von Aero Basic und Aero Glass stellen im Wesentlichen die Grenze zwischen den Benutzeroberflächenstandards vor DWM und dem neuen Standard dar. Die Aero Basic-Schnittstelle bietet den Programmen die gleiche API, um die Abwärtskompatibilität zu wahren, aber das Ausführen der Basic-Schnittstelle bedeutet, dass der ältere Fenstermanager verwendet wird und DWM nicht aktiv ist. Bei Verwendung der älteren Schnittstelle verhält sich das Layout der Benutzeroberfläche so, wie dies von Programmen vor Windows Vista erwartet wird. DWM steuert die Aero Glass-Schnittstelle und schränkt den Zugriff auf sie ein. Wenn eine Anwendung in dem Bereich angezeigt wird, der kein Clientbereich ist (also im Glasframe), dann wird dies von DWM erkannt und auf den Aero Basic-Frame umgeschaltet.
Der Compositing-Desktop in Windows Vista ermöglicht weitere neue Features: die neue Windows-Aufgabenumschaltung Flip (Alt + Tab) und Flip 3D (Alt + Windows-Taste). Die Flip 3D-Aufgabenumschaltung ist von besonderem Interesse, da ihre Funktionalität von einem Code in DWM abhängt, der jedes oberste Fenster im Szenendiagramm in eine Folge abgeschrägter Fenster rendert, durch die Sie mit der Tastatur oder der Maus hindurchschalten können (siehe Abbildung 1).
Die Interaktion von Fenstern mit dem Desktopkompositionsmodul wird von DWM gesteuert. Wenn Sie ein Programm in die DWM-Funktionalität integrieren möchten, müssen Sie verstehen, wie DWM funktioniert und wie Sie damit interagieren können. Neben einer Vielzahl anderer Funktionen verfügt DWM in seiner öffentlichen API über vier primäre funktionale Bereiche:
  • Grundlegende Desktopkompositionseinstellungen
  • Rendern des Glaseffekts in einem Clientfenster
  • Rendern von Miniaturansichten
  • Feinabstimmung des Renderns für die Interaktion mit Multimediaprogrammen
Die ersten drei Bereiche werden in diesem Artikel behandelt. Der letzte Bereich ist für DirectX und Videowiedergabeanwendungen vorgesehen, da DWM asynchron ausgeführt wird, was bei ungenügender Kontrolle zu Samplingfehlern führen kann.

Einige allgemeine Compositing-Funktionen
Zum Verwenden der Desktopkompositionsfunktionalität in einem Programm müssen Sie verschiedene DWM-Parameter abfragen und festlegen. Wenn beispielsweise eine Anwendung in die Vollbildanzeige schaltet und DWM danach die Komposition deaktiviert und mit der Desktop-Hintergrundfarbe ohne Transparenz rendert, sollte die Anwendung dies erkennen und kompositionsspezifische Features deaktivieren. Die grundlegenden Funktionen zum Integrieren eines Programms mit DWM lauten wie folgt:
DwmEnableComposition Aktiviert oder deaktiviert DWM-Komposition. DWM behält diese Einstellung für die Dauer des aktuellen Prozesses oder bis zu seiner Rücksetzung bei. Eine Änderung dieser Einstellung löst eine WM_DWMCOMPOSITIONCHANGED-Benachrichtigung aus. Bei den meisten Anwendungen muss diese Funktion nicht aufgerufen werden, aber Sie sollten darauf achten, ob die resultierende Windows-Meldung ausgegeben wird.
DwmIsCompositionEnabled Ruft den Kompositionsaktivierungszustand von DWM für den Desktop ab.
DwmSetWindowAttribute Legt den Wert des angegebenen DWM-Attributs für ein Fenster fest und steuert, wie DWM-Übergänge verarbeitet werden, ob Nicht-Client-Rendern möglich ist und wie Flip 3D das Fenster behandeln soll. Wenn für ein Fenster beispielsweise Nicht-Client-Rendern deaktiviert ist, schlagen spätere Aufrufe zum Erweitern des Frames oder der Unschärfe hinter dem Fenster fehl.
DwmGetWindowAttribute Ruft den aktuellen Wert des angegebenen DWMWINDOWATTRIBUTE für ein bestimmtes Fenster ab.
DwmGetColorizationColor Ruft die aktuelle Farbe ab, die zur DWM-Glaskomposition verwendet wird. Dieser Wert basiert auf dem aktuellen Farbschema. Eine Änderung dieser Einstellung löst eine WM_WMCOLORIZATIONCOLORCHANGED-Benachrichtigung aus.
DwmDefWindowProc Diese Funktion aktiviert DWM-Treffertests innerhalb des Bereichs, der kein Clientbereich ist, wenn sie mit der WM_NCHITTEST-Benachrichtigung aufgerufen wird, sowie in bestimmten Situationen, in denen Sie evtl. WM_NCCALCSIZE und ähnliches verarbeiten müssen, weil Sie den Clientframe erweitert haben.
Es ist recht einfach, in einem Programm den Glaseffekt zu rendern. Der DWM stellt zu diesem Zweck zwei Funktionen bereit:
DwmExtendFrameIntoClientArea Diese einfache Funktion dehnt die Kante des Nicht-Client-Frames in das Fenster aus.
DwmEnableBlurBehindWindow Diese kompliziertere Funktion gibt Ihnen wesentlich mehr Kontrolle darüber, wie der Glaseffekt gerendert wird.
Da alle Compositing-Fenster von DWM in ein Fenster außerhalb der Bildschirmanzeige gerendert und später auf dem Desktop zusammengesetzt werden, ist es einfach, mithilfe dieser Bilder eine Live-Miniaturansicht der Anwendung zu erzeugen. DWM stellt vier Funktionen bereit, mit denen Sie das Rendern von Miniaturansichten steuern können:
DwmQueryThumbnailSourceSize Gibt die Quellgröße der DWM-Miniaturansicht zurück.
DwmRegisterThumbnail Erstellt eine Miniaturansichtsbeziehung zwischen dem Ziel- und dem Quellfenster.
DwmUnregisterThumbnail Entfernt eine DWM-Miniaturansichtbeziehung, die mit DwmRegisterThumbnail erstellt wurde.
DwmUpdateThumbnailProperties Aktualisiert die Eigenschaften für eine bestimmte Miniaturansicht.
DWM bietet außerdem fünf Funktionen zur Feinabstimmung des DWM-Renderns, aber eine Beschreibung dieser Funktionen würde den Rahmen dieses Artikels sprengen.

Vorbereitung für Aero Glass
Um die DWM-Schnittstelle zu programmieren, müssen Sie eine Windows Vista-Version ausführen, die Aero Glass anzeigen kann. Diese neuen Funktionen lassen sich zwar am einfachsten mit C++-Code aufrufen, aber ich persönlich schreibe Benutzeroberflächencode gerne in C#, falls möglich. Der gesamte Code für diesen Artikel wurde in C# geschrieben, was bedeutet, dass sie ihn ggf. anpassen müssen. Um die in diesem Artikel behandelten Funktionen verwenden zu können, müssen Sie entweder C++ einsetzen und die richtige Bibliothek verknüpfen oder für die Funktionen und Strukturen in C# sogenannte P/Invoke-Wrapper schreiben. Dem Download für diesen Artikel habe ich eine Bibliothek mit Wrappers für die von DWM benötigten Funktionen und Strukturen beigefügt, damit Sie DWM mit Ihrem C#-Programm aufrufen können. Im Grunde handelt es sich dabei lediglich um einen Satz von Anweisungen zum Laden der Schnittstelle mit dwmapi.dll. Um die DWM-Funktionen für den Glaseffekt und die Miniaturansichten nutzen zu können, die in diesem Artikel beschrieben werden, müssen Sie C#-Deklarationen der DWM-Funktionen und -Datenstrukturen erstellen. Die Deklarationen, die ich für diesen Artikel erstellt habe, sind in Abbildung 5 aufgeführt.
internal class DwmApi
{
    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmEnableBlurBehindWindow(
        IntPtr hWnd, DWM_BLURBEHIND pBlurBehind);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmExtendFrameIntoClientArea(
        IntPtr hWnd, MARGINS pMargins);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmEnableComposition(bool bEnable);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmGetColorizationColor(
        out int pcrColorization, 
        [MarshalAs(UnmanagedType.Bool)]out bool pfOpaqueBlend);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern IntPtr DwmRegisterThumbnail(
        IntPtr dest, IntPtr source);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmUnregisterThumbnail(IntPtr hThumbnail);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmUpdateThumbnailProperties(
        IntPtr hThumbnail, DWM_THUMBNAIL_PROPERTIES props);

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern void DwmQueryThumbnailSourceSize(
        IntPtr hThumbnail, out Size size);

    [StructLayout(LayoutKind.Sequential)]
    public class DWM_THUMBNAIL_PROPERTIES
    {
        public uint dwFlags;
        public RECT rcDestination;
        public RECT rcSource;
        public byte opacity;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fVisible;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fSourceClientAreaOnly;
        public const uint DWM_TNP_RECTDESTINATION = 0x00000001;
        public const uint DWM_TNP_RECTSOURCE = 0x00000002;
        public const uint DWM_TNP_OPACITY = 0x00000004;
        public const uint DWM_TNP_VISIBLE = 0x00000008;
        public const uint DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010;
    }

    [StructLayout(LayoutKind.Sequential)]
    public class MARGINS
    {
        public int cxLeftWidth, cxRightWidth, 
                   cyTopHeight, cyBottomHeight;

        public MARGINS(int left, int top, int right, int bottom)
        {
            cxLeftWidth = left; cyTopHeight = top; 
            cxRightWidth = right; cyBottomHeight = bottom;
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public class DWM_BLURBEHIND
    {
        public uint dwFlags;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fEnable;
        public IntPtr hRegionBlur;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fTransitionOnMaximized;

        public const uint DWM_BB_ENABLE = 0x00000001;
        public const uint DWM_BB_BLURREGION = 0x00000002;
        public const uint DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int left, top, right, bottom;

        public RECT(int left, int top, int right, int bottom)
        {
            this.left = left; this.top = top; 
            this.right = right; this.bottom = bottom;
        }
    }
}
Wenn Sie C# verwenden, müssen Sie im Code etwas Ähnliches erstellen. Danach können Sie DWM-Aufrufe vornehmen, wenn Sie Windows Vista ausführen. Selbstverständlich soll die Anwendung nicht lediglich annehmen, dass sie unter Windows Vista ausgeführt wird. Vergewissern Sie sich daher, dass Environment.OSVersion.Version.Major mindestens 6.0 entspricht. Alternativ dazu können Sie die Ausnahmen abfangen, die bei dem Versuch entstehen, über P/Invoke nicht vorhandene Funktionen aufzurufen.
Wenn Sie die Glaseffekte nutzen möchten, muss der von Ihnen verwendete Computer drei Anforderungen erfüllen. Erstens muss Windows Vista Premium, Windows Vista Business oder Windows Vista Ultimate ausgeführt werden. Zweitens muss die Hardware in der Lage sein, die Aero-Schnittstelle auszuführen (Näheres dazu finden Sie unter microsoft.com/windowsvista/getready/capable.mspx). Schließlich müssen Sie in Windows Vista das Windows Aero-Farbschema auswählen. Verwenden Sie es sparsam, da es die GPU Ihres Computers und bei übermäßiger Verwendung auch den Benutzer überfordern kann.
Abbildung 6 Optionen für Fensterfarbe und Darstellung (Klicken Sie zum Vergrößern auf das Bild)
Sie aktivieren das Aero-Schema durch Öffnen von „Personalisierung“ in der Systemsteuerung und anschließendes Klicken auf die Option „Fensterfarbe und -darstellung“. Vergewissern Sie sich, dass in diesem Fenster (siehe Abbildung 6) die Option „Transparenz aktivieren“ ausgewählt ist, und klicken Sie danach auf die Verknüpfung „Eigenschaften für klassische Darstellung öffnen“. Klicken Sie im Dialogfeld für die Anzeigeeinstellungen unter „Farbschema“ auf „Windows Aero“ (siehe Abbildung 7). Wenn Sie auf „OK“ klicken, sind die Aero-Schnittstelle und der Glaseffekt sichtbar. Bei Bedarf können Sie auch die Fensterfarbe und die Transparenzstufe anpassen.
Abbildung 7 Windows Aero Glass-Effekte (Klicken Sie zum Vergrößern auf das Bild)

Programmieren des Desktopfenster-Managers
Durch Aufrufen von DwmIsCompositionEnabled können Sie prüfen, ob das Aero-Schema in Ihrem Programm aktiviert ist. Seien Sie sich jedoch darüber im Klaren, dass der Benutzer das aktuelle Aero-Schema nicht nur jederzeit ändern kann, sondern dass es auch von anderen Anwendungen programmatisch aktiviert oder deaktiviert werden kann. Daher ist eine einmalige Prüfung des Ergebnisses dieser Funktion evtl. nicht ausreichend.
Die Funktion DwmEnableComposition ermöglicht einem Programm, das Aero-Schema zu aktivieren oder zu deaktivieren. Wenn Sie beispielsweise eine Anwendung schreiben, bei der Kompatibilitätsprobleme zu erwarten sind, möchten Sie möglicherweise die Komposition während der Ausführung deaktivieren (wenn Sie eine exklusive DirectX-Anwendung für Vollbildanzeige schreiben, wird die Komposition automatisch deaktiviert). Diese Einstellung wird nur so lange beibehalten, bis der Prozess abgeschlossen ist, der sie ausgelöst hat. Sobald dieser Prozess endet, wird das Kompositionsflag auf seinen ursprünglichen Wert zurückgesetzt. Im Allgemeinen sollten Anwendungen diese Möglichkeit nicht nutzen, sondern diese Entscheidung dem System oder dem Benutzer überlassen, es sei denn, es bestehen Anwendungskompatibilitätsgründe hierfür.
Bei einer Änderung des Desktopkompositionsstatus wird eine WM_DWMCOMPOSITIONCHANGED-Meldung übertragen. Da es keine Parameter gibt, aus denen ersichtlich ist, ob die Komposition aktiviert oder deaktiviert ist, steht es Ihnen frei, DwmIsCompositionEnabled für diese Informationen aufzurufen. Der Code zur Durchführung dieser Überprüfung ist ganz einfach. Der schwierige Teil daran besteht in der Entscheidung, wie das Fenster bei deaktivierter Komposition aussehen soll.
// Check to see if composition is Enabled
if (DwmIsCompositionEnabled())
{
    // enable glass rendering
}
else
{
    // fallback rendering
}
Selbst bei aktiviertem Aero-Schema könnte der Benutzer evtl. die Glasfarbe geändert und die Komposition undurchsichtig gemacht haben. Ich habe eine kleine Anwendung geschrieben, die ein Fenster erstellt, das vollständig aus Glas besteht und danach in der Systemsteuerung die Glaseigenschaften geändert (siehe Abbildung 8). Das erste Bild zeigt die Standardeinstellung für die Farbe und Transparenz des Fensters. Danach habe ich die Transparenz deaktiviert, wodurch das Fenster undurchsichtig wurde. Ich habe die Fensterfarbe auf rot und die Standardtransparenz so eingestellt, dass noch etwas von dem darunter liegenden Fenster zu erkennen ist. Ab einer bestimmten Größe werden Sie in einem undurchsichtigen Fenster einen streifenartigen diagonalen Aurora-Effekt auf der Glasdarstellung bemerken.
Abbildung 8a Ändern von Farbe und Transparenz 
Abbildung 8b
Abbildung 8c
Sie können Kompositionsfarbe und -transparenz durch Aufrufen der Funktion DwmGetColorizationColor prüfen. Wenn diese Funktion erfolgreich ausgeführt wird, legt sie einen GDI+ ARGB-Farbwert sowie einen booleschen Wert fest, der angibt, ob die Farbe transparent ist. Genau wie beim Ändern des Aero-Schemas in der Systemsteuerung wird beim Ändern der Kompositionsfarbe eine Meldung übertragen. Wenn dies geschieht, wird WM_DWMCOLORIZATIONCOLORCHANGED gesendet, aber in diesem Fall teilen Ihnen die Parameter mit, wie die neue Farbe und die Transparenz beschaffen sind.
protected override void WndProc(ref Message msg)
{
    switch (msg.Msg)
    {
        case WM_DWMCOLORIZATIONCOLORCHANGED:
            // The color format of currColor is 0xAARRGGBB.
            uint currColor = (uint)msg.WParam.ToInt32();
            bool opacityblend = (msg.LParam.ToInt32() != 0);
            ...
            break;
    }
}
Wenn für den Bereich, der kein Clientbereich ist, das DWM-Rendern geändert wird, wird eine WM_DWMNCRENDERINGCHANGED-Meldung gesendet. Der Parameter wParam ist wahr (true), wenn durch DWM Nicht-Client-Rendern aktiviert ist. Sie werden auch dann benachrichtigt, wenn ein von DWM zusammengesetztes Fenster maximiert angezeigt bzw. die maximierte Anzeige deaktiviert und eine WM_DWMWINDOWMAXIMIZEDCHANGE-Meldung gesendet wird. Wenn das Fenster maximiert wurde, ist wParam wahr (true).
Weiter oben in diesem Artikel wurde bereits auf die beiden Funktionen zur Integration des Glaseffekts in ein Programm hingewiesen. Die erste Funktion ist DwmExtendFrameIntoClientArea. Ein Fenster mit dem Aero-Schema hat Glas im Titelleistenbereich und in einem Rahmen um die Fenster herum, also praktisch in allen Fensterbereichen, die keine Clientbereiche sind. Diese Funktion ermöglicht es, jede Seite des Bereichs, der kein Clientbereich ist, in den Clientbereich auszudehnen und mit dem Glaseffekt zu rendern. Anders ausgedrückt, kann der obere, linke, rechte und untere Rand des Glasfensterrahmens nahtlos in das Fenster ausgedehnt werden.
Die zweite Funktion ist DwmEnableBlurBehindWindow, mit der ein willkürlich gestalteter Bereich mit dem Glaseffekt gerendert und weitere Parameter mit stärkerer Kontrolle über den Effekt eingestellt werden können. Ich vermute allerdings, dass die meisten Benutzer des Glaseffekts einfach das Glas von der Kante in den Clientbereich ausdehnen werden. Bei jeder dieser Funktionen müssen Sie den Kompositionsstatus genau nachverfolgen, um zu sehen, ob Sie mit aktiviertem Glaseffekt rendern sollten oder nicht. Dies bedeutet, dass Sie die vier WM_DWM*-Meldungen nachverfolgen oder DwmIsCompositionEnabled aufrufen müssen, um festzustellen, ob Sie mit aktiviertem oder deaktiviertem Glaseffekt rendern sollten.
Betrachten wir zunächst die einfachere Vorgehensweise. Diese Funktion ist zur Verwendung für Fenster ohne Rahmen (z. B. die Taskleiste, die Sidebar, das Tablettstifteingabefenster und das Startmenü) vorgesehen. Das Verhalten eingerahmter Fenster ist nicht festgelegt.
Die Funktion DwmExtendFrameIntoClientArea arbeitet mit einem Fensterhandle und einer MARGINS-Struktur. Das Fensterhandle ist das Fenster, für das der Rahmen von der Kante in den Clientbereich ausgedehnt werden soll. Sie müssen eine MARGINS-Struktur einrichten, in der die Anzahl der Pixel enthalten ist, um die der Rahmen in den Clientbereich erweitert werden soll. Eine C#-Implementierung der MARGINS-Struktur ist in Abbildung 5 zu sehen.
Dies ist zunächst ein wenig verwirrend, da es keine anderen Win32-Funktionen gibt, die auf diese Weise arbeiten, aber im Grunde steuern Sie damit jede Seite unabhängig von den anderen Seiten. Wählen Sie die Seiten, die Sie ausdehnen möchten, und legen Sie fest, wie weit in den Clientbereich hinein der Effekt gerendert werden soll (siehe Abbildung 9). Wenn Sie möchten, dass mehr als eine Seite erweitert werden soll, können sich die Seiten auch überlappen. Wenn der Effekt die Fenstergröße dynamisch verfolgen soll, müssen Sie bei jeder Änderung der Fenstergröße die Funktion DwmExtendFrameIntoClientArea aufrufen. Ein Sonderfall liegt dann vor, wenn ein oder mehrere Ränder auf -1 festgelegt werden, wodurch der Glaseffekt auf das ganze Fenster ausgedehnt wird. Um die Ränder zurückzusetzen, setzen Sie einfach alle Ränderwerte auf 0, und rufen Sie DwmExtendFrameIntoClientArea erneut auf.
Abbildung 9 Glasränder im Clientbereich (Klicken Sie zum Vergrößern auf das Bild)
Was müssen Sie also tun, wenn der Glaseffekt nicht vom Rahmen in den Clientbereich ausgedehnt werden soll? Die Funktion DwmEnableBlurBehindWindow gibt Ihnen ein wenig mehr Kontrolle darüber, wie der Glaseffekt dem Fenster hinzugefügt wird. Auch diese Funktion arbeitet mit dem Fensterhandle des Fensters, dem Sie den Glaseffekt hinzufügen möchten, aber sie verwendet darüber hinaus eine DWM_BLURRBEHIND-Struktur, die Ihnen das Festlegen verschiedener Parameter ermöglicht, um zu steuern, wie der Unschärfeeffekt auf das Fenster angewendet werden soll. Der wichtigste dieser Parameter ist ein Bereich, wobei es sich um einen GDI-Begriff für einen willkürlich gestalteten Bereich handelt, der in der Regel durch eine Reihe von Linien und Kurven gebildet wird.
Die in Abbildung 5 gezeigte DWM_BLURRBEHIND-Struktur enthält die Parameter, mit denen die Darstellung des Unschärfeeffekts gesteuert wird.
Wenn Sie den Glaseffekt im Clientbereich aktivieren möchten, setzen Sie das fEnable-Flag auf „true“. Um ihn zu deaktivieren, setzen Sie das Flag auf „false“. Der Parameter hRgnBlur ist ein Handle zu einem von Ihnen zu erstellenden Bereich, auf dem der Glaseffekt erscheinen soll. Genau wie beim Einstellen des Randwerts -1 für Dwm-ExtendFrameIntoClientArea wird DWM durch Einstellen des Parameters hRgnBlur auf Null in der Unschärfestruktur angewiesen, den Glaseffekt auf das ganze Fenster anzuwenden.
Der abschließende Parameter fTransitionOnMaximized ist ein wenig irreführend. Da der Glaseffekt bei maximierten Fenstern deaktiviert ist, könnte man meinen, dass dieses Flag etwas damit zu tun hat. Stattdessen steuert das Flag, ob das Fenster zur maximierten Farbe wechseln soll oder nicht, wenn sich ein bereits maximiertes Fenster auf dem Desktop befindet. Wenn Sie diesen Parameter auf „true“ setzen, erhalten Sie beim Rendern des Fensters leider einen Bereich ohne Transparenz, in dem lediglich der Aurora-Effekt enthalten ist.
Mit dem Parameter dwFlags teilen Sie der Schnittstelle mit, welche Parameter Sie einstellen. Wenn Sie einen Parameter einstellen möchten, müssen Sie im Parameter dwFlags das entsprechende Bit aktivieren. Dies gilt für die gesamte DWM-Schnittstelle.
Vergessen Sie nicht, dass Sie die Glasfarbe in den Bereich rendern müssen. Der gleiche schwarze Pinsel wie bei DwmExtendFrameIntoClientArea eignet sich gut dazu, im angegebenen Bereich einen Glaseffekt zu erzeugen.
Es ist leicht zu erkennen, dass DWM zwei Schnittstellen bereitstellt. Mit der komplizierteren Schnittstelle kann ein willkürlich gestalteter Bereich erstellt werden, und die einfachere ermöglicht es, den Glaseffekt der Fensterrahmen in den Clientbereich auszudehnen, damit zusätzliche Steuerelemente und ähnliche Objekte auf ein Element gezeichnet werden können, das wie ein Bestandteil der Titelleiste aussieht. In beiden Fällen müssen Sie bedenken, welche Auswirkungen ein Ändern der Fenstergröße auf die Bereichsform hat und den Bereich aktualisieren, in dem der Glaseffekt gerendert wird, also u. U. den gesamten Clientbereich. Der diesem Artikel beigefügte Quellcode ermöglicht Ihnen, sowohl einen erweiterten Clientrahmen bzw. einen Bereich festzulegen als auch das Kompositionsflag umzuschalten.

Zeichnen auf Glas
Glas als Hintergrund für ein Fenster zu verwenden, ist eine etwas heikle Sache. Wenn Sie etwas rendern, das normalerweise undurchsichtig ist (z. B. GDI-Funktionen), wird das Objekt auf Glas gerendert, was jedoch manchmal zu unerwarteten Ergebnissen führen kann. Wenn Sie das Renderergebnis mit der Glasoberfläche verschmelzen möchten, müssen Sie eine Funktionalität verwenden, die den Alphakanal an Farben verwendet, wie z. B. GDI+, Windows Presentation Foundation oder die Themen-API in Windows XP.
Ein ganz besonderer Haken besteht darin, dass beim Rendern eines GDI-Objekts in Schwarz das Bitmuster 0x00000000 verwendet wird, denn bei diesem Bitmuster handelt es sich um ein vollständig transparentes Schwarz, falls Sie einen Alphakanal verwenden. Beim Zeichnen mit einem schwarzen GDI-Pinsel oder GDI-Stift erhalten Sie also nicht die Farbe Schwarz, sondern eine transparente Farbe. Das größte Problem tritt dann auf, wenn Sie versuchen, in einem Steuerelement eines Textlabels im Glasbereich die Standardtextfarbe zu verwenden. Da es sich bei der Standardtextfarbe in der Regel um Schwarz handelt, wird dies von DWM als transparent betrachtet und der Text im Glas falsch angezeigt. Ein Beispiel dafür ist in Abbildung 10 zu sehen. Die erste Zeile wurde mit GDI+ geschrieben, und bei der zweiten Zeile handelt es sich um ein Textlabelsteuerelement, das die Standardfarbe verwendet. Wie Sie sehen, ist es fast unleserlich, weil es sich um falsch gerenderten Text handelt, der nicht schwarz, sondern grau angezeigt wird.
Abbildung 10 Transparentes Dialogfeld 
Glücklicherweise gibt es mehrere Möglichkeiten, dieses Problem zu vermeiden. Eine dieser Methoden besteht darin, Besitzerzeichnungssteuerelemente zu verwenden. Sie könnten auch in ein Bitmap rendern, das einen Alphakanal verwendet. Zum Glück besteht das einfachste Verfahren, Steuerelemente mit Text zu versehen, darin, dies von .NET Framework 2.0 mit GDI+ erledigen zu lassen. Das können Sie leicht bewerkstelligen, indem Sie für die Steuerelemente die Eigenschaft UseCompatibleTextRendering einstellen. Standardmäßig ist diese Eigenschaft auf „false“ eingestellt, damit Steuerelemente, die für vorherige Versionen von .NET Framework geschrieben wurden, auf dieselbe Weise gerendert werden. Wenn Sie diese Eigenschaft jedoch auf „true“ setzen, wird der Text korrekt angezeigt. Sie können die Eigenschaft mit der Methode Application.SetUseCompatibleTextRenderingDefault global einstellen. Wenn Sie Visual Studio® 2005 verwenden, enthält der Vorlagencode einen Aufruf, der kompatibles Textrendern in der Hauptroutine vor der Formularerstellung auf „false“ setzt. Sie müssen diesen Code lediglich wie unten gezeigt auf „true“ setzen, damit alle Steuerelemente beim Schreiben auf ein Glasfenster korrekt angezeigt werden.
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(true);
    Application.Run(new GlassForm());
}
Weitere Informationen zu diesem Thema und zur Verwendung der TextRenderer-Klasse finden Sie im MSDN-Magazin vom März 2006 im Artikel Erstellen von globalen Anwendungen mithilfe komplexer Skripte in Windows Forms-Steuerelementen von Miguel A. Lacouture.
Sie sollten den Glaseffekt erst kurz vor dem Rendern des Fensters aktivieren. Das Kompositionsmodul prüft die Alphawerte des Fensters und wendet den Unschärfeeffekt auf die Bereiche an, die nicht undurchsichtig sind. Dies kann bei Verwendung einiger GDI-Funktionen, die keine Alphawerte beibehalten, Probleme verursachen. Sie können im Bedarfsfall GDI+ verwenden, sollten jedoch vorsichtig sein, da GDI+-Aufrufe nicht in der Hardware, sondern in der Software gerendert werden. Dies hat zur Folge, dass bei häufiger Fensteraktualisierung in Verbindung mit GDI+-Aufrufen die Systemressourcen stark belastet werden.
Das Einstellen des Glaseffekts in DirectX-Anwendungen wird auf dieselbe Weise vorgenommen. Sie müssen lediglich zusätzlich zur Verwendung einer der beiden DWM-Funktionen für die Glasaktivierung auch den Alphawert des Renderziels steuern. In den Bereichen, in denen Sie DWM angewiesen haben, Glas zu verwenden, setzt DWM den Alphawert des Renderziels ein. In allen anderen Bereichen müsste das Renderziel undurchsichtig oder ein nicht festgelegtes Verhalten die Folge sein.

Miniaturansichten
Miniaturansichten sind ausschließlich Live-Anzeigefenster in offenen Anwendungen, die von DWM gerendert werden. Miniaturansichten werden von den Aufgabenumschaltungen Flip und Alt + Tab verwendet. Sie können praktisch eine Miniaturansicht eines Anwendungsfensters anfordern und es in der Anwendung rendern lassen. Die Miniaturansicht-API stellt eine Live-Darstellung eines Anwendungsfensters bereit.
Miniaturansichten sind einfach zu verwenden, da Ihnen der größte Teil der Arbeit von Windows abgenommen wird. Der schwierige Teil besteht darin, das HWND einer Anwendung zu finden. Wenn Sie das gewünschte HWND gefunden haben, registrieren Sie einfach eine Miniaturansicht zur Verknüpfung dieses HWND mit dem HWND des Fensters, in dem die Miniaturansicht gerendert werden soll, und der Position innerhalb dieses Fensters. Das Betriebssystem nimmt danach alle erforderlichen Aktualisierungen vor. Bei jeder Änderung des Quellfensters wird die Änderung im Zielfenster übernommen.
Eine Miniaturansicht muss zunächst mithilfe der Funktion DwmRegisterThumbnail registriert werden. Sie stellen zwei Fensterhandles bereit, das Quell-HWND (das Fenster, das als Miniaturansicht dargestellt werden soll) und das Ziel-HWND (das Fenster, in dem die Miniaturansicht gerendert werden soll). Wenn eine Miniaturansicht nicht weiter verwendet werden soll, müssen Sie DWM durch Aufrufen von DwmUnregisterThumbnail mitteilen, dass die Beziehung beendet werden soll. Nach Erstellen einer Miniaturansicht gibt die Funktion DwmRegisterThumbnail ein Miniaturansichtshandle zurück, das von allen weiteren Miniaturansichtsfunktionen als Argument verwendet wird. Rufen Sie für eine registrierte Miniaturansicht DwmUpdateThumbnailProperties auf, damit die Miniaturansicht aktualisiert wird. Beispielcode für ein Formular, das eine Live-Miniaturansicht eines anderen Fensters rendert, ist in Abbildung 11 aufgeführt.
public partial class Thumbnail : Form
{
    private IntPtr m_hThumbnail;

    public Thumbnail() { InitializeComponent(); }

    public void CreateAndShow(IntPtr sourceWindow)
    {
        m_hThumbnail = DwmApi.DwmRegisterThumbnail(
            Handle, sourceWindow);

        DwmApi.DWM_THUMBNAIL_PROPERTIES m_ThumbnailProperties = 
            new DwmApi.DWM_THUMBNAIL_PROPERTIES();
        m_ThumbnailProperties.dwFlags = 
            DwmApi.DWM_THUMBNAIL_PROPERTIES.DWM_TNP_VISIBLE +
            DwmApi.DWM_THUMBNAIL_PROPERTIES.DWM_TNP_OPACITY +
            DwmApi.DWM_THUMBNAIL_PROPERTIES.DWM_TNP_RECTDESTINATION +
            DwmApi.DWM_THUMBNAIL_PROPERTIES.
                DWM_TNP_SOURCECLIENTAREAONLY;
        m_ThumbnailProperties.opacity = 255;
        m_ThumbnailProperties.fVisible = true;
        m_ThumbnailProperties.rcSource = 
            m_ThumbnailProperties.rcDestination = new DwmApi.RECT(0, 0,
                ClientRectangle.Right, ClientRectangle.Bottom);
        m_ThumbnailProperties.fSourceClientAreaOnly = false;

        DwmApi.DwmUpdateThumbnailProperties(
            m_hThumbnail, m_ThumbnailProperties);

        Show();
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null)) components.Dispose();
        base.Dispose(disposing);

        if (m_hThumbnail != IntPtr.Zero)
        {
            if (DwmApi.DwmIsCompositionEnabled()) 
                DwmApi.DwmUnregisterThumbnail(m_hThumbnail);
            m_hThumbnail = IntPtr.Zero;
        }
    }
}
Zusätzlich zu den beiden Funktionen zum Registrieren und zum Aufheben der Registrierung einer Miniaturansicht gibt es zwei weitere Funktionen für Miniaturansichten. DwmQueryThumbnailSourceSize gibt die Quellgröße der angegebenen Miniaturansicht zurück. DwmUpdateThumbnailProperties ermöglicht es, die Eigenschaften einer vorgegebenen DWM-Miniaturansicht zu aktualisieren. Diese Funktion verwendet eine DWM_THUMBNAIL_PROPERTIES-Struktur, für die in Abbildung 5 eine C#-Implementierung gezeigt wird.
Die DWM_THUMBNAIL_PROPERTIES-Struktur ermöglicht Ihnen das Festlegen einer Anzahl von Eigenschaften, zum Beispiel das Zielrechteck im Zielfenster (das rcDestination-Element) und den zu verwendenden rechteckigen Bereich des Quellfensters (das rcSource-Element), falls Sie nicht das gesamte Quellfenster nutzen möchten.
Sie können auch die Transparenz der Miniaturansicht festlegen, falls es nicht völlig undurchsichtig sein soll, indem Sie das opacity-Element verwenden, wobei der Wert 0 Transparenz und der Wert 255 Undurchsichtigkeit bedeutet. Wenn die Miniaturansicht unsichtbar sein soll, können Sie das fVisible-Flag auf „false“ setzen. Wenn Sie für die Miniaturansicht nicht das gesamte Quellfenster (einschließlich der Bereiche, die keine Clientbereiche sind, wie z. B. des Rahmens und der Titelleiste), sondern lediglich den Clientbereich des Fensters verwenden möchten, können Sie den booleschen Wert fSourceClientAreaOnly auf „true“ setzen. Über den Parameter dwFlags teilen Sie der Schnittstelle mit, welche Parameter Sie einstellen. Wenn Sie einen Parameter einstellen, müssen Sie im Parameter dwFlags das entsprechende Bit aktivieren.
Außerdem gibt es für die Größe des Zielfensters keinerlei Einschränkung. Sie können also ohne Weiteres die Miniaturansichtschnittstelle dazu verwenden, das Quellfenster zu vergrößern oder zu verkleinern. Es gibt allerdings eine Einschränkung zur Beibehaltung des Seitenverhältnisses. Das Seitenverhältnis des Quellfensters wird immer beibehalten. Wenn sich die Größe des Quellfensters ändert, wird die Größe der Miniaturansicht ebenfalls geändert, damit die Miniaturansicht innerhalb der Begrenzungen bleibt.
Im diesem Artikel beigefügten Quellcode ist eine Schaltfläche enthalten, mit deren Hilfe eine kleine Live-Miniaturansicht des Hauptanwendungsfensters erstellt werden kann, wie in Abbildung 12 dargestellt.
Es ist leicht zu erkennen, dass das Rendern der Miniaturansicht live durchgeführt wird. Wenn Sie das Hauptanwendungsfenster ändern, sehen Sie, wie die Miniaturansicht aktualisiert wird. Mit ein wenig Einfallsreichtum wird es Ihnen nicht schwer fallen, mit Miniaturansichten und den Win32-Funktionen FindWindow und GetWindow eigene Aufgabenumschaltungen zu erstellen.
Abbildung 12a Erstellen einer Live-Miniaturansicht  
Abbildung 12b

Schlussbemerkung
Dies war eine kleine Spritztour durch die DWM-Schnittstellen. Ich bin davon überzeugt, dass Sie einige nette Anwendungsmöglichkeiten für diese APIs finden werden. Wenn der Glaseffekt erst einmal populär geworden ist, werden wir sicherlich eine ganze Menge äußerst raffinierter Anwendungen dieses Fenstereffekts sehen. Für weitere Informationen empfehle ich das Blog von Greg Schechter unter blogs.msdn.com/greg_schechter.

Ron Fosner schreibt seit 20 Jahren 3D-Anwendungen für Windows und kennt sich allmählich damit aus. Er leitet DirectX.com und schreibt leidenschaftlich gern schnelle OpenGL- und Direct3D-Anwendungen. Sie erreichen ihn unter der Adresse Ron@directx.com. Ich danke Greg Schechter und Jevan Saks von Microsoft für ihre Hilfe bei diesem Artikel.

Page view tracker