Direct2D-Schnellstart

Direct2D ist eine API mit nativem Code im unmittelbaren Modus zum Erstellen von 2D-Grafiken. In diesem Thema wird veranschaulicht, wie Sie Direct2D in einer typischen Win32-Anwendung verwenden, um in einen HWND zu zeichnen.

Hinweis

Wenn Sie eine Windows Store-App erstellen möchten, die Direct2D verwendet, lesen Sie den Direct2D-Schnellstart für Windows 8 Thema.

 

Dieses Thema enthält folgende Abschnitte:

Zeichnen eines einfachen Rechtecks

Um ein Rechteck mit GDI zu zeichnen, können Sie die WM_PAINT-Meldung verarbeiten, wie im folgenden Code gezeigt.

switch(message)
{

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(hwnd, &ps);

            // Obtain the size of the drawing area.
            RECT rc;
            GetClientRect(
                hwnd,
                &rc
            );          

            // Save the original object
            HGDIOBJ original = NULL;
            original = SelectObject(
                ps.hdc,
                GetStockObject(DC_PEN)
            );

            // Create a pen.            
            HPEN blackPen = CreatePen(PS_SOLID, 3, 0);

            // Select the pen.
            SelectObject(ps.hdc, blackPen);

            // Draw a rectangle.
            Rectangle(
                ps.hdc, 
                rc.left + 100, 
                rc.top + 100, 
                rc.right - 100, 
                rc.bottom - 100);   

            DeleteObject(blackPen);

            // Restore the original object
            SelectObject(ps.hdc, original);

            EndPaint(hwnd, &ps);
        }
        return 0;

// Code for handling other messages. 

Der Code zum Zeichnen des gleichen Rechtecks mit Direct2D ist ähnlich: Er erstellt Zeichnungsressourcen, beschreibt eine zu zeichnende Form, zeichnet die Form und gibt dann die Zeichnungsressourcen frei. In den folgenden Abschnitten werden die einzelnen Schritte ausführlich beschrieben.

Schritt 1: Einschließen des Direct2D-Headers

Zusätzlich zu den Headern, die für eine Win32-Anwendung erforderlich sind, schließen Sie den d2d1.h-Header ein.

Schritt 2: Erstellen einer ID2D1Factory

Eines der ersten Schritte eines Direct2D-Beispiels ist das Erstellen einer ID2D1Factory.

ID2D1Factory* pD2DFactory = NULL;
HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    &pD2DFactory
    );

Die ID2D1Factory-Schnittstelle ist der Ausgangspunkt für die Verwendung von Direct2D. verwenden Sie eine ID2D1Factory , um Direct2D-Ressourcen zu erstellen.

Wenn Sie eine Factory erstellen, können Sie angeben, ob es sich um multi- oder Singlethreads handelt. (Weitere Informationen zu Multithreadfactorys finden Sie in den Hinweisen auf der ID2D1Factory-Referenzseite.) In diesem Beispiel wird eine Singlethreadfactory erstellt.

Im Allgemeinen sollte Ihre Anwendung die Factory einmal erstellen und für die Lebensdauer der Anwendung beibehalten.

Schritt 3: Erstellen einer ID2D1HwndRenderTarget

Nachdem Sie eine Factory erstellt haben, verwenden Sie sie, um ein Renderziel zu erstellen.



// Obtain the size of the drawing area.
RECT rc;
GetClientRect(hwnd, &rc);

// Create a Direct2D render target          
ID2D1HwndRenderTarget* pRT = NULL;          
HRESULT hr = pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(
        hwnd,
        D2D1::SizeU(
            rc.right - rc.left,
            rc.bottom - rc.top)
    ),
    &pRT
);

Ein Renderziel ist ein Gerät, das Zeichnungsvorgänge ausführen und geräteabhängige Zeichnungsressourcen wie Pinsel erstellen kann. Verschiedene Arten von Renderzielen, die auf verschiedenen Geräten gerendert werden. Im vorherigen Beispiel wird ein ID2D1HwndRenderTarget verwendet, das in einem Teil des Bildschirms gerendert wird.

Wenn möglich, verwendet ein Renderziel die GPU, um Renderingvorgänge zu beschleunigen und Zeichnungsressourcen zu erstellen. Andernfalls verwendet das Renderziel die CPU, um Renderinganweisungen zu verarbeiten und Ressourcen zu erstellen. (Sie können dieses Verhalten ändern, indem Sie beim Erstellen des Renderziels die D2D1_RENDER_TARGET_TYPE Flags verwenden.)

Die CreateHwndRenderTarget-Methode akzeptiert drei Parameter. Der erste Parameter, eine D2D1_RENDER_TARGET_PROPERTIES Struktur, gibt Remoteanzeigeoptionen an, ob das Renderziel auf Software oder Hardware gerendert werden soll, und den DPI-Wert. Der Code in diesem Beispiel verwendet die Hilfsfunktion D2D1::RenderTargetProperties , um Standardeigenschaften des Renderziels zu akzeptieren.

Der zweite Parameter, eine D2D1_HWND_RENDER_TARGET_PROPERTIES-Struktur , gibt den HWND an, in dem Inhalt gerendert wird, die Anfangsgröße des Renderziels (in Pixel) und die zugehörigen Präsentationsoptionen. In diesem Beispiel wird die Hilfsfunktion D2D1::HwndRenderTargetProperties verwendet, um einen HWND und eine Anfangsgröße anzugeben. Es werden Standardpräsentationsoptionen verwendet.

Der dritte Parameter ist die Adresse des Zeigers, der den Renderzielverweis empfängt.

Wenn Sie ein Renderziel erstellen und die Hardwarebeschleunigung verfügbar ist, ordnen Sie Ressourcen auf der GPU des Computers zu. Wenn Sie ein Renderziel einmal erstellen und es so lange wie möglich beibehalten, profitieren Sie von Leistungsvorteilen. Ihre Anwendung sollte Renderziele einmal erstellen und diese für die Lebensdauer der Anwendung oder bis zum Empfang des D2DERR_RECREATE_TARGET-Fehlers behalten. Wenn sie diesen Fehler erhalten, müssen Sie das Renderziel (und alle erstellten Ressourcen) neu erstellen.

Schritt 4: Erstellen eines Pinsels

Wie eine Factory kann ein Renderziel Zeichnungsressourcen erstellen. In diesem Beispiel erstellt das Renderziel einen Pinsel.

ID2D1SolidColorBrush* pBlackBrush = NULL;
if (SUCCEEDED(hr))
{
            
    pRT->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &pBlackBrush
        ); 
}

Ein Pinsel ist ein Objekt, das einen Bereich zeichnet, z. B. den Strich einer Form oder die Füllung einer Geometrie. Der Pinsel in diesem Beispiel zeichnet einen Bereich mit einer vordefinierten Volltonfarbe Schwarz.

Direct2D bietet auch andere Pinseltypen: Farbverlaufpinsel zum Zeichnen linearer und radialer Farbverläufe und einen Bitmappinsel zum Zeichnen mit Bitmaps und Mustern.

Einige Zeichnungs-APIs stellen Stifte zum Zeichnen von Konturen und Pinsel zum Füllen von Formen bereit. Direct2D ist anders: Es stellt kein Stiftobjekt bereit, sondern verwendet einen Pinsel zum Zeichnen von Konturen und Füllen von Formen. Verwenden Sie beim Zeichnen von Gliederungen die ID2D1StrokeStyle-Schnittstelle mit einem Pinsel, um Pfadstreichvorgänge zu steuern.

Ein Pinsel kann nur mit dem Renderziel, von dem er erstellt wurde, und mit anderen Renderzielen in derselben Ressourcendomäne verwendet werden. Im Allgemeinen sollten Sie Pinsel einmal erstellen und für die Lebensdauer des Renderziels beibehalten, von dem sie erstellt wurden. ID2D1SolidColorBrush ist die einzige Ausnahme. Da die Erstellung relativ kostengünstig ist, können Sie bei jedem Zeichnen eines Frames einen ID2D1SolidColorBrush erstellen, ohne dass die Leistung spürbar ist. Sie können auch einen einzelnen ID2D1SolidColorBrush verwenden und die Farbe bei jeder Verwendung ändern.

Schritt 5: Zeichnen des Rechtecks

Verwenden Sie als Nächstes das Renderziel, um das Rechteck zu zeichnen.

 
pRT->BeginDraw();

pRT->DrawRectangle(
    D2D1::RectF(
        rc.left + 100.0f,
        rc.top + 100.0f,
        rc.right - 100.0f,
        rc.bottom - 100.0f),
        pBlackBrush);

HRESULT hr = pRT->EndDraw();  

Die DrawRectangle-Methode verwendet zwei Parameter: das zu zeichnende Rechteck und den Pinsel, der zum Zeichnen der Kontur des Rechtecks verwendet werden soll. Optional können Sie auch die Optionen Strichbreite, Bindestrichmuster, Linienverknappung und Endkappe angeben.

Sie müssen die BeginDraw-Methode aufrufen, bevor Sie Zeichnungsbefehle ausgeben, und Sie müssen die EndDraw-Methode aufrufen, nachdem Sie die Ausführung von Zeichnungsbefehlen abgeschlossen haben. Die EndDraw-Methode gibt ein HRESULT zurück , das angibt, ob die Zeichnungsbefehle erfolgreich waren.

Schritt 6: Freigeben von Ressourcen

Wenn keine Frames mehr zu zeichnen sind oder der D2DERR_RECREATE_TARGET-Fehler angezeigt wird, lassen Sie das Renderziel und alle erstellten Geräte frei.

 
SafeRelease(pRT);
SafeRelease(pBlackBrush);

Wenn Ihre Anwendung die Verwendung von Direct2D-Ressourcen abgeschlossen hat (z. B. wenn sie beendet wird), geben Sie die Direct2D-Factory frei.

 
SafeRelease(pD2DFactory);

Erstellen einer einfachen Direct2D-Anwendung

Der Code in diesem Thema zeigt die grundlegenden Elemente einer Direct2D-Anwendung. Aus Gründen der Kürze werden das Anwendungsframework und der Fehlerbehandlungscode weggelassen, der für eine gut geschriebene Anwendung charakteristisch ist. Eine ausführlichere exemplarische Vorgehensweise, die den vollständigen Code zum Erstellen einer einfachen Direct2D-Anwendung und bewährte Entwurfsmethoden veranschaulicht, finden Sie unter Erstellen einer einfachen Direct2D-Anwendung.

Einfache Direct2D-Anwendung erstellen