Übersicht über die Direct2D-API
Direct2D bietet eine API ähnlich wie Direct3D für die Verwendung mit C oder C++. Die API macht eine Vielzahl von zeichnungsbezogenen Funktionen verfügbar:
- Renderziele für die Anzeige und das Rendern auf dem Bildschirm mithilfe von 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.
- Renderingfunktionen für Bitmaps, Geometrien und Text.
- Bestimmungen für die Verwendung grafischer Inhalte, die mit GDI oder Direct3D erstellt wurden.
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
- Zeichnen von Ressourcen
- Zeichnen von Text
- Direct2D-Grundtypen
- 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 Zeichnungsgrundtypen 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 des Imageeffekte-Teils der Direct2D-API für Windows 8 und höher. |
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 der Liste der Bibliotheken d2d1.lib hinzu. Sie finden d2d1.h und d2d1.lib im 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 Stamm 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 sind einem bestimmten Renderinggerät zugeordnet und funktionieren nicht mehr, wenn dieses Gerät entfernt wird.
(Weitere Informationen zu Ressourcen und ressourcenfreigaben 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 , um Direct2D-Ressourcen zu instanziieren. Um eine ID2D1Factory zu erstellen, verwenden Sie eine der CreateFactory-Methoden .
Eine Factory definiert einen Satz von CreateResource-Methoden , die die folgenden Zeichnungsressourcen erzeugen können:
- Renderziele sind Objekte, die Zeichnungsbefehle rendern.
- Zeichnungszustandsblöcke sind Objekte, die Zeichnungszustandsinformationen wie die aktuelle Transformation und den Antialiasingmodus speichern.
- Geometrien sind Objekte, die einfache und potenziell komplexe Formen darstellen.
Eines der nützlichsten Objekte, die eine Factory erstellen kann, ist das ID2D1RenderTarget, das im folgenden Abschnitt beschrieben wird.
Renderziele
Ein Renderziel ist eine Ressource, die von der ID2D1RenderTarget-Schnittstelle erbt. Ein Renderziel erstellt Ressourcen für das 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.
- Bitmaprenderungszielobjekte rendern Inhalt in einer Off-Screen-Bitmap.
- DXGI-Renderzielobjekte werden auf einer DXGI-Oberfläche für die Verwendung mit Direct3D gerendert.
Da ein Renderziel einem bestimmten Renderinggerät zugeordnet ist, handelt es sich um eine geräteabhängige Ressource, die nicht mehr funktioniert, wenn das Gerät entfernt wird.
Renderzielfeatures
Sie können angeben, ob ein Renderziel die Hardwarebeschleunigung verwenden soll und ob die Remoteanzeige vom lokalen oder Remotecomputer gerendert werden soll. Renderziele können für Alias- oder Antialiased-Rendering eingerichtet werden. Für Renderingszenen 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 auch Zeichnungsvorgänge in Ebenen gruppieren, die von der ID2D1Layer-Schnittstelle dargestellt werden. Ebenen sind nützlich für das Sammeln von Zeichnungsvorgängen, die beim Rendern eines Frames zusammengesetzt werden sollen. In einigen Szenarien kann dies eine nützliche Alternative zum Rendern in einem Bitmaprenderingziel und dann zum erneuten Verwenden des Bitmapinhalts sein, da die Zuordnungskosten für layering 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 zwischengeschaltetes Offscreenrendering, während die verschiedenen Renderzieleigenschaften beibehalten werden, die für das Original festgelegt wurden.
Es ist auch möglich, GDI auf einem Direct2D-Renderziel zu rendern, indem QueryInterface für ein Renderziel für ID2D1GdiInteropRenderTarget aufgerufen wird, das über GetDC - und ReleaseDC-Methoden 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 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE-Flags 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 erfordern, mit GDI zu rendern. Weitere Informationen finden Sie in der Übersicht über die Direct2D- und GDI-Interoperabilität.
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 Zeichnungsmethoden des Renderziels. 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 eine primitive oder eine Geometrie) und einen Pinsel zum Ausfüllen oder Skizzieren der Form an.
Renderziele bieten auch Methoden zum Ausschneiden, Anwenden von Deckkraftmasken und Transformieren des Koordinatenraums.
Direct2D verwendet ein linkshändiges Koordinatensystem: Positive x-Achsenwerte gehen nach rechts und positive y-Achsenwerte gehen nach unten.
Fehlerbehandlung
Renderbefehle für die Zielzeichnung 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.
Zeichnen von Ressourcen
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 Pinseltypen:
- 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, mischt.
- ID2D1RadialGradientBrush zeichnet einen Bereich mit einem radialen Farbverlauf, der zwei oder mehr Farben um eine Ellipse mischt.
- ID2D1BitmapBrush zeichnet einen Bereich mit einer Bitmap.
Zum Erstellen eines Pinsels verwenden Sie eine der METHODEN ID2D1RenderTarget::Create*<Type>*Brush, z. B. CreateRadialGradientBrush. Pinsel können mit den Draw- und Fill-Methoden zum Zeichnen eines Renderziels verwendet werden, entweder zum Malen eines Formstrichs oder einer Kontur oder als Deckkraftmaske.
Weitere Informationen zu Pinseln finden Sie in der Übersicht über Pinsel.
Geometrien
Zusätzlich zu grundlegenden Zeichnungsgrundlagen wie Punkten, Rechtecken und Auslassungspunkten stellt Direct2D die ID2D1Geometry-Schnittstelle zum Beschreiben einfacher und komplexer Formen bereit. Schnittstellen, die von ID2D1Geometry erben, definieren verschiedene Formentypen, z. B . ID2D1RectangleGeometry für die Darstellung von Rechtecke, ID2D1RoundedRectangleGeometry für die Darstellung gerundeter Rechtecke und ID2D1EllipseGeometry für die Darstellung von Ellipsen.
Komplexere Formen können mithilfe der ID2D1GeometrySink-Schnittstelle erstellt werden, um eine Reihe von Figuren anzugeben, die aus Linien, Kurven und Bögen bestehen. Der 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 formatierten Texts für das künstlerische Rendering zu extrahieren.
Die Geometrieschnittstellen bieten Methoden zum Bearbeiten von Formen durch Erweitern oder Vereinfachen vorhandener Geometrien oder durch Generieren der Schnittmenge oder Vereinigung mehrerer Geometrien. Sie bieten auch Methoden zum Bestimmen, ob Geometrien sich überschneiden oder überlappen, um Begrenzungsinformationen abzurufen, die Fläche oder Länge einer Geometrie zu berechnen und Standorte entlang einer Geometrie zu interpolieren. Direct2D bietet auch die Möglichkeit, ein Gitter aus Dreiecken zu erstellen, das aus einer Geometrie tesselliert wird.
Zum Erstellen einer Geometrie verwenden Sie eine der Methoden ID2D1Factory::Create*<Type>*Geometry, z. B . CreatePathGeometry. Eine Geometrie ist eine geräteunabhängige Ressource.
Zum Rendern einer Geometrie verwenden Sie die Methoden DrawGeometry und FillGeometry eines Renderziels.
Weitere Informationen zu Geometrien finden Sie in der Übersicht über Geometrien.
Bitmaps
Direct2D bietet keine Methoden zum Laden oder Speichern von Bitmaps. Stattdessen können Sie Bitmaps mit der Windows-Bildverarbeitungskomponente (WIC) erstellen. Bitmapressourcen können mithilfe von 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 mit anderen Mitteln eingerichtet wurden. Nachdem eine Bitmap erstellt wurde, kann sie mit der DrawBitmap-Methode des Renderziels oder mit einem Bitmappinsel gezeichnet werden.
Da das Erstellen von Bitmapressourcen auf Hardwarerenderingzielen häufig ein teurer Vorgang ist, kann Direct2D den Inhalt einer Bitmap (oder eines Teils der Bitmap) mithilfe der Methoden CopyFromBitmap, CopyFromRenderTarget und CopyFromMemory aktualisieren. Die Verwendung dieser Methoden kann möglicherweise die Kosten sparen, 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, DrawTextLayout und 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, in denen eine Unicode-Textzeichenfolge mit minimaler Formatierung gerendert wird. Komplexere Layout- und typografische Flexibilität bietet die ID2D1RenderTarget::D rawTextLayout-Methode , die ein IDWriteTextLayout-Objekt verwendet, um den zu renderden Inhalt und die Formatierung anzugeben. MIT IDWriteTextLayout können Sie individuelle Formatierungen für Teilzeichenfolgen von Text und andere erweiterte Typografieoptionen angeben.
Für Szenarien, in denen eine präzise Steuerung des Layouts auf Glyphenebene erforderlich ist, kann die ID2D1RenderTarget::D rawGlyphRun-Methode in Verbindung mit den von DirectWrite bereitgestellten Messmöglichkeiten verwendet werden.
Um die DirectWrite-API zu verwenden, schließen Sie den dwrite.h-Header 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 die Create-Methoden, um DirectWrite Ressourcen (z. B. IDWriteTextFormat) zu erstellen.
Weitere Informationen zu DirectWrite finden Sie im Thema Einführung in DirectWrite.
Direct2D-Grundtypen
Direct2D definiert eine Reihe von Grundtypen, die denen ähneln, die von anderen Zeichnungs-APIs bereitgestellt werden. Es bietet eine Farbstruktur, eine Matrixstruktur zum Ausführen von Transformationen sowie Gleitkomma- und Ganzzahlversionen von Punkten, Rechtecke, Auslassungspunkten und Größenstrukturen. In der Regel verwenden Sie die Gleitkommaversionen dieser Strukturen.
Sie verwenden keine Factory oder ein Renderziel, um Direct2D-Grundtypen zu instanziieren. Sie können sie direkt erstellen oder die in d2d1helper.h definierten Hilfsmethoden verwenden, um sie zu erstellen.
Zugehörige Themen