Übersicht über die Direct2D-API
Direct2D bietet eine API ähnlich wie Direct3D für die Verwendung mit C oder C++. Die API stellt eine Vielzahl von zeichnungsbezogenen Funktionen zur Verfügung:
- Rendern von Zielen für das Anzeigen und Rendern außerhalb des Bildschirms mit Direct2D, Direct3D oder GDI.
- Objekte zum Verwalten des Zeichnungszustands, z. B. Koordinatenraumtransformationen und Antialiasingmodi.
- Darstellungen für geometrische Daten und Funktionen für die Geometrieverarbeitung.
- Renderingfunktionalität für Bitmaps, Geometrien und Text.
- Stellen Sie für die Verwendung grafischer Inhalte, die mithilfe von GDI oder Direct3D erstellt wurden, ein.
Dieses Thema bietet eine Übersicht über die Objekte, aus denen die Direct2D-API besteht. Sie enthält die folgenden Abschnitte:
- Direct2D-Headerdateien
- Direct2D-Schnittstellen
- Die ID2D1Factory-Schnittstelle
- Renderziele
- Zeichnungsressourcen
- Zeichnen von Text
- Direct2D-Primitive
- Zugehörige Themen
Direct2D-Headerdateien
Die Direct2D-API wird durch die folgenden Headerdateien definiert.
| Headerdatei | BESCHREIBUNG |
|---|---|
| d2d1.h | Definiert C- und C++-Versionen der primären Direct2D-API. |
| d2d1helper.h | Definiert C++-Hilfsfunktionen, -Klassen und -Strukturen. |
| d2dbasetypes.h | Definiert Zeichnungsprimitiven für Direct2D, z. B. Punkte und Rechtecke. Dieser Header ist in d2d1.h enthalten. |
| d2derr.h | Definiert die Fehlercodes für Direct2D. Dieser Header ist in d2d1.h enthalten. |
| d2d1 _ 1.h | Definiert C- und C++-Versionen der primären Direct2D-API für Windows 8 und höher. |
| d2d1 _ 1helper.h | Definiert C++-Hilfsfunktionen, -Klassen und -Strukturen für Windows 8 und höher. |
| d2d1effects.h | Definiert C- und C++-Versionen der Imageeffekte, die Teil der Direct2D-API für Windows 8 und höher sind. |
| d2d1effecthelpers.h | Definiert C++-Hilfsfunktionen, -Klassen und -Strukturen des Bildeffektteils der Direct2D-API für Windows 8 und höher. |
Um Direct2D zu verwenden, sollte Ihre Anwendung die Headerdatei d2d1.h enthalten.
Um eine Direct2D-Anwendung zu kompilieren, fügen Sie d2d1.lib zur Liste der Bibliotheken hinzu. Sie finden d2d1.h und d2d1.lib in Windows Software Development Kit (SDK) für Windows 7.
In den folgenden Abschnitten werden einige der allgemeinen Schnittstellen beschrieben, die von der Direct2D-API bereitgestellt werden.
Direct2D-Schnittstellen
Im Stammverzeichnis der Direct2D-API befinden sich die Schnittstellen ID2D1Factory und ID2D1Resource. Ein ID2D1Factory-Objekt erstellt ID2D1Resource-Objekte und dient als Ausgangspunkt für die Verwendung von Direct2D. Alle anderen Direct2D-Objekte erben von der ID2D1Resource-Schnittstelle. Es gibt zwei Arten von Direct2D-Ressourcen: geräteunabhängige Ressourcen und geräteabhängige Ressourcen.
- Geräteunabhängige Ressourcen sind keinem bestimmten Renderinggerät zugeordnet und können für die Lebensdauer einer Anwendung beibehalten werden.
- Geräteabhängige Ressourcen werden einem bestimmten Renderinggerät zugeordnet und funktionieren nicht mehr, wenn dieses Gerät entfernt wird.
(Weitere Informationen zu Ressourcen und zur Ressourcenfreigabe finden Sie in der Ressourcenübersicht.)
Die ID2D1Factory-Schnittstelle
Die ID2D1Factory-Schnittstelle ist der Ausgangspunkt für die Verwendung von Direct2D. Sie verwenden eine ID2D1Factory zum Instanziieren von Direct2D-Ressourcen. Zum Erstellen einer ID2D1Factory verwenden Sie eine der CreateFactory-Methoden.
Eine Factory definiert einen Satz von Methoden zum Erstellen von Ressourcen, die die folgenden Zeichnungsressourcen erzeugen können:
- Renderziele sind Objekte, die Zeichnungsbefehle rendern.
- Zeichnungszustandsblöcke sind Objekte, die Zeichnungszustandsinformationen speichern, z. B. die aktuelle Transformation und den Antialiasingmodus.
- Geometrien sind Objekte, die einfache und potenziell komplexe Formen darstellen.
Eines der nützlichsten Objekte, die eine Factory erstellen kann, ist die ID2D1RenderTarget,die im folgenden Abschnitt beschrieben wird.
Renderziele
Ein Renderziel ist eine Ressource, die von der ID2D1RenderTarget-Schnittstelle erbt. Ein Renderziel erstellt Ressourcen zum Zeichnen und führt Zeichnungsvorgänge aus. Es gibt verschiedene Arten von Renderzielen, die zum Rendern von Grafiken auf folgende Weise verwendet werden können:
- ID2D1HwndRenderTarget-Objekte rendern Inhalt in einem Fenster.
- ID2D1DCRenderTarget-Objekte werden in einem GDI-Gerätekontext gerendert.
- Bitmap-Renderzielobjekte rendern Inhalt in einer Bitmap außerhalb des Bildschirms.
- DXGI Renderzielobjekte werden zur Verwendung mit Direct3D auf einer DXGI-Oberfläche gerendert.
Da ein Renderziel einem bestimmten Renderinggerät zugeordnet ist, ist es eine geräteabhängige Ressource und funktioniert nicht mehr, wenn das Gerät entfernt wird.
Renderzielfeatures
Sie können angeben, ob ein Renderziel die Hardwarebeschleunigung verwenden soll und ob die Remoteanzeige vom lokalen Computer oder Remotecomputer gerendert werden soll. Renderziele können für das Rendern mit Alias oder Antialiasing eingerichtet werden. Für das Rendern von Szenen mit einer großen Anzahl von Primitiven kann ein Entwickler auch 2D-Grafiken im Aliasmodus rendern und D3D-Multisample-Antialiasing verwenden, um eine höhere Skalierbarkeit zu erzielen.
Renderziele können Zeichnungsvorgänge auch in Ebenen gruppieren, die von der ID2D1Layer-Schnittstelle dargestellt werden. Ebenen sind nützlich, um Zeichnungsvorgänge zu sammeln, die beim Rendern eines Frames zusammengesetzt werden sollen. In einigen Szenarien kann dies eine nützliche Alternative zum Rendern in ein Bitmaprenderziel sein und dann den Bitmapinhalt wiederverwenden, da die Zuordnungskosten für die Schichtung niedriger sind als für ein ID2D1BitmapRenderTarget.
Renderziele können neue Renderziele erstellen, die mit sich selbst kompatibel sind. Dies ist nützlich für das Zwischenrendering außerhalb des Bildschirms, während die verschiedenen Renderzieleigenschaften beibehalten werden, die auf dem Original festgelegt wurden.
Es ist auch möglich, mithilfe von GDI auf einem Direct2D-Renderziel zu rendern, indem QueryInterface auf einem Renderziel für ID2D1GdiInteropRenderTargetaufgerufen wird, das über die Methoden GetDC und ReleaseDC verfügt, die zum Abrufen eines GDI-Gerätekontexts verwendet werden können. Das Rendern über GDI ist nur möglich, wenn das Renderziel mit dem festgelegten Flag D2D1 _ RENDER TARGET USAGE _ _ _ GDI _ COMPATIBLE erstellt wurde. Dies ist nützlich für Anwendungen, die hauptsächlich mit Direct2D gerendert werden, aber über ein Erweiterbarkeitsmodell oder andere Legacyinhalte verfügen, die die Möglichkeit zum Rendern mit GDI erfordern. Weitere Informationen finden Sie unter Direct2D- und GDI-Interoperabilität – Übersicht.
Rendern von Zielressourcen
Wie eine Factory kann ein Renderziel Zeichnungsressourcen erstellen. Alle von einem Renderziel erstellten Ressourcen sind geräteabhängige Ressourcen (genau wie das Renderziel). Ein Renderziel kann die folgenden Ressourcentypen erstellen:
- Bitmaps
- Pinsel
- Ebenen
- Gittermodelle
Zeichenbefehle
Zum Rendern von Inhalten verwenden Sie die Renderziel-Zeichnungsmethoden. Bevor Sie mit dem Zeichnen beginnen, rufen Sie die ID2D1RenderTarget::BeginDraw-Methode auf. Nachdem Sie das Zeichnen abgeschlossen haben, rufen Sie die ID2D1RenderTarget::EndDraw-Methode auf. Zwischen diesen Aufrufen verwenden Sie die Draw- und Fill-Methoden, um Zeichnungsressourcen zu rendern. Die meisten Draw- und Fill-Methoden nehmen eine Form (entweder einen Primitiven oder eine Geometrie) und einen Pinsel zum Füllen oder Gliederung der Form an.
Renderziele stellen auch Methoden zum Ausschneiden, Anwenden von Deckkraftmasken und Transformieren des Koordinatenraums bereit.
Direct2D verwendet ein linkshändiges Koordinatensystem: Positive x-Achsenwerte werden nach rechts und positive y-Achsenwerte nach unten verschoben.
Fehlerbehandlung
Renderzielzeichnungsbefehle geben nicht an, ob der angeforderte Vorgang erfolgreich war. Um herauszufinden, ob Zeichnungsfehler aufgetreten sind, rufen Sie die Flush-Methode des Renderziels oder die EndDraw-Methode auf, um ein HRESULT abzurufen.
Zeichnungsressourcen
In den folgenden Abschnitten werden einige der Ressourcen beschrieben, die von den Renderziel- und Factoryschnittstellen erstellt werden können.
Pinsel
Ein Pinsel, der durch die ID2D1Brush-Schnittstelle dargestellt wird, ist eine geräteabhängige Ressource, die von einem Renderziel erstellt wird und einen Bereich mit seiner Ausgabe zeichnet. Verschiedene Pinsel haben unterschiedliche Ausgabetypen. Einige Pinsel zeichnen einen Bereich mit einer Volltonfarbe, andere mit einem Farbverlauf oder einem Bild. Direct2D bietet vier Arten von Pinseln:
- ID2D1SolidColorBrush zeichnet einen Bereich mit einer Volltonfarbe.
- ID2D1LinearGradientBrush zeichnet einen Bereich mit einem linearen Farbverlauf, der zwei oder mehr Farben über eine Linie, die Farbverlaufsachse, überblendet.
- ID2D1RadialGradientBrush zeichnet einen Bereich mit einem radialen Farbverlauf, der zwei oder mehr Farben um eine Ellipse kombiniert.
- ID2D1BitmapBrush zeichnet einen Bereich mit einer Bitmap.
Um einen Pinsel zu erstellen, verwenden Sie eine der Methoden ID2D1RenderTarget::Create < Type > Brush, z. B. CreateRadialGradientBrush. Pinsel können mit den Draw- und Fill-Methoden des Renderziels verwendet werden, entweder zum Zeichnen eines Formstrichs oder einer Kontur oder als Deckkraftmaske.
Weitere Informationen zu Pinseln finden Sie in der Übersicht über Pinsel.
Geometrien
Zusätzlich zu einfachen Zeichnungsprimitiven wie Punkten, Rechtecke und Ellipsen stellt Direct2D die ID2D1Geometry-Schnittstelle zum Beschreiben einfacher und komplexer Formen bereit. Schnittstellen, die von ID2D1Geometry erben, definieren verschiedene Arten von Formen, z. B. ID2D1RectangleGeometry für die Darstellung von Rechtecke, ID2D1RoundedRectangleGeometry für die Darstellung abgerundeter Rechtecke und ID2D1EllipseGeometry für die Darstellung von Ellipsen.
Komplexere Formen können mithilfe der ID2D1GeometrySink-Schnittstelle erstellt werden, um eine Reihe von Abbildungen anzugeben, die aus Linien, Kurven und Bogen bestehen. Id2D1GeometrySink wird an die Open-Methode einer ID2D1PathGeometry übergeben, um eine komplexe Geometrie zu generieren. ID2D1SimplifiedGeometrySink kann auch mit der DirectWrite-API verwendet werden, um Pfadgliederungen von formatiertem Text für das rendern zu extrahieren.
Die Geometrieschnittstellen stellen Methoden zum Bearbeiten von Formen bereit, indem vorhandene Geometrien erweitert oder vereinfacht oder die Schnittmenge oder Vereinigung mehrerer Geometrien generiert wird. Sie stellen auch Methoden bereit, um zu bestimmen, ob Geometrien sich überschneiden oder überlappen, Umgrenzungsinformationen abzurufen, den Bereich oder die Länge einer Geometrie zu berechnen und Positionen entlang einer Geometrie zu interpolieren. Direct2D bietet auch die Möglichkeit, ein Gitternetz von Dreiecken zu erstellen, das aus einer Geometrie mosaikiert ist.
Um eine Geometrie zu erstellen, verwenden Sie eine der ID2D1Factory::Create < > Type Geometry-Methoden, z. B. CreatePathGeometry. Eine Geometrie ist eine geräteunabhängige Ressource.
Zum Rendern einer Geometrie verwenden Sie die DrawGeometry- und FillGeometry-Methoden eines Renderziels.
Weitere Informationen zu Geometrien finden Sie in der Übersicht über Geometrien.
Bitmaps
Direct2D stellt keine Methoden zum Laden oder Speichern von Bitmaps bereit. Stattdessen können Sie Bitmaps mithilfe der Windows Imaging Component (WIC)erstellen. Bitmapressourcen können mit WIC geladen und dann zum Erstellen einer ID2D1Bitmap über die ID2D1RenderTarget::CreateBitmapFromWicBitmap-Methode verwendet werden.
Bitmaps können auch aus In-Memory-Daten erstellt werden, die auf andere Weise eingerichtet wurden. Nachdem eine Bitmap erstellt wurde, kann sie von der DrawBitmap-Renderzielmethode oder mit einem Bitmappinsel gezeichnet werden.
Da das Erstellen von Bitmapressourcen auf Hardwarerenderzielen häufig ein aufwendiger Vorgang ist, kann Direct2D den Inhalt einer Bitmap (oder eines Teils der Bitmap) mithilfe der Methoden CopyFromBitmap, CopyFromRenderTargetund CopyFromMemory aktualisieren. Die Verwendung dieser Methoden kann potenziell kostensparend sein, die mit zusätzlichen GPU-Texturzuordnungen verbunden sind.
Zeichnen von Text
Direct2D wurde für die Arbeit mit den Textvorgängen der neuen Text-API DirectWrite entwickelt. Um die Verwendung der DirectWrite-API zu vereinfachen, stellen Renderziele drei Methoden zum Rendern DirectWrite Textressourcen bereit: DrawText, DrawTextLayoutund DrawGlyphRun. Da Direct2D die GPU für den ClearType-Textrenderingprozess verwendet, bietet Direct2D eine geringere CPU-Auslastung als GDI für Textvorgänge und eine bessere Skalierbarkeit, da mehr GPU-Verarbeitungsleistung verfügbar ist.
ID2D1RenderTarget::D rawText ist für die einfachsten Szenarien konzipiert, die das Rendern einer Unicode-Textzeichenfolge mit minimaler Formatierung betreffen. Komplexere Layout- und typografische Flexibilität wird über die ID2D1RenderTarget::D rawTextLayout-Methode bereitgestellt, die ein IDWriteTextLayout-Objekt verwendet, um den Inhalt und die Formatierung anzugeben, die gerendert werden sollen. MIT IDWriteTextLayout können Sie individuelle Formatierungen für Teilzeichenfolgen von Text und andere erweiterte Typografieoptionen angeben.
In Szenarien, in denen eine präzise Steuerung des Layouts auf Glyphenebene erforderlich ist, kann die ID2D1RenderTarget::D rawGlyphRun-Methode in Verbindung mit den von DirectWritebereitgestellten Messmöglichkeiten verwendet werden.
Um die DirectWrite-API zu verwenden, schließen Sie den Header dwrite.h ein. Wie Direct2D verwendet DirectWrite eine Factory, IDWriteFactory, um Textobjekte zu erstellen. Verwenden Sie die DWriteCreateFactory-Funktion, um eine Factory zu erstellen, und verwenden Sie dann ihre Create-Methoden, um DirectWrite Ressourcen zu erstellen (z. B. IDWriteTextFormat).
Weitere Informationen zu DirectWrite finden Sie im Thema Einführung in DirectWrite.
Direct2D-Primitive
Direct2D definiert eine Reihe von Primitiven, die denen von anderen Zeichnungs-APIs ähneln. Sie bietet eine Farbstruktur, eine Matrixstruktur zum Durchführen von Transformationen sowie Gleitkomma- und Ganzzahlversionen von Punkten, Rechtecke, Ellipsen und Größenstrukturen. In der Regel verwenden Sie die Gleitkommaversionen dieser Strukturen.
Sie verwenden keine Factory oder ein Renderziel, um Direct2D-Primitive zu instanziieren. Sie können sie direkt erstellen oder die in d2d1helper.h definierten Hilfsmethoden verwenden, um sie zu erstellen.