Zeichnen mit Direct2D

Nachdem Sie Ihre Grafikressourcen erstellt haben, können Sie zeichnen.

Zeichnen einer Ellipse

Das Circle-Programm führt eine sehr einfache Zeichnungslogik durch:

  1. Füllen Sie den Hintergrund mit einer einfarbigen Farbe.
  2. Zeichnen Sie einen gefüllten Kreis.

Ein Screenshot des Kreisprogramms.

Da das Renderziel ein Fenster (im Gegensatz zu einer Bitmap oder einer anderen Offscreen-Oberfläche) ist, erfolgt das Zeichnen als Reaktion auf WM_PAINT Nachrichten. Der folgende Code zeigt die Fensterprozedur für das Circle-Programm.

LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_PAINT:
            OnPaint();
            return 0;

         // Other messages not shown...
    }
    return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
}

Hier ist der Code, der den Kreis zeichnet.

void MainWindow::OnPaint()
{
    HRESULT hr = CreateGraphicsResources();
    if (SUCCEEDED(hr))
    {
        PAINTSTRUCT ps;
        BeginPaint(m_hwnd, &ps);
     
        pRenderTarget->BeginDraw();

        pRenderTarget->Clear( D2D1::ColorF(D2D1::ColorF::SkyBlue) );
        pRenderTarget->FillEllipse(ellipse, pBrush);

        hr = pRenderTarget->EndDraw();
        if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
        {
            DiscardGraphicsResources();
        }
        EndPaint(m_hwnd, &ps);
    }
}

Die ID2D1RenderTarget-Schnittstelle wird für alle Zeichnungsvorgänge verwendet. Die Methode des OnPaint Programms führt Folgendes aus:

  1. Die ID2D1RenderTarget::BeginDraw-Methode signalisiert den Beginn des Zeichnens.
  2. Die ID2D1RenderTarget::Clear-Methode füllt das gesamte Renderziel mit einer Volltonfarbe aus. Die Farbe wird als D2D1_COLOR_F Struktur angegeben. Sie können die D2D1::ColorF-Klasse verwenden, um die Struktur zu initialisieren. Weitere Informationen finden Sie unter Verwenden von Farbe in Direct2D.
  3. Die ID2D1RenderTarget::FillEllipse-Methode zeichnet eine gefüllte Ellipse unter Verwendung des angegebenen Pinsels für die Füllung. Eine Ellipse wird durch einen Mittelpunkt und die x- und y-Radien angegeben. Wenn die x- und y-Radien identisch sind, ist das Ergebnis ein Kreis.
  4. Die ID2D1RenderTarget::EndDraw-Methode signalisiert die Vervollständigung der Zeichnung für diesen Frame. Alle Zeichnungsvorgänge müssen zwischen Aufrufen von BeginDraw und EndDraw platziert werden.

Die Methoden BeginDraw, Clear und FillEllipse verfügen alle über einen void-Rückgabetyp . Wenn während der Ausführung einer dieser Methoden ein Fehler auftritt, wird der Fehler über den Rückgabewert der EndDraw-Methode signalisiert. Die CreateGraphicsResources Methode wird im Thema Erstellen von Direct2D-Ressourcen gezeigt. Diese Methode erstellt das Renderziel und den Einfarbigpinsel.

Das Gerät kann die Zeichenbefehle puffern und die Ausführung zurückstellen, bis EndDraw aufgerufen wird. Sie können das Gerät erzwingen, alle ausstehenden Zeichnungsbefehle auszuführen, indem Sie ID2D1RenderTarget::Flush aufrufen. Leerungen können jedoch die Leistung beeinträchtigen.

Behandeln von Geräteverlusten

Während Ihres Programms ausgeführt wird, ist das von Ihnen verwendete Grafikgerät möglicherweise nicht mehr verfügbar. Beispielsweise kann das Gerät verloren gehen, wenn sich die Anzeigeauflösung ändert oder wenn der Benutzer die Grafikkarte entfernt. Wenn das Gerät verloren geht, wird auch das Renderziel ungültig, zusammen mit allen geräteabhängigen Ressourcen, die dem Gerät zugeordnet waren. Direct2D signalisiert ein verlorenes Gerät, indem der Von der EndDraw-MethodeD2DERR_RECREATE_TARGET Fehlercode zurückgegeben wird. Wenn Sie diesen Fehlercode erhalten, müssen Sie das Renderziel und alle geräteabhängigen Ressourcen neu erstellen.

Um eine Ressource zu verwerfen, lassen Sie einfach die Schnittstelle für diese Ressource frei.

void MainWindow::DiscardGraphicsResources()
{
    SafeRelease(&pRenderTarget);
    SafeRelease(&pBrush);
}

Das Erstellen einer Ressource kann ein teurer Vorgang sein, daher erstellen Sie Ihre Ressourcen nicht für jede WM_PAINT Nachricht neu. Erstellen Sie einmal eine Ressource, und speichern Sie den Ressourcenzeiger zwischen, bis die Ressource aufgrund eines Geräteverlustes ungültig wird oder Sie diese Ressource nicht mehr benötigen.

Direct2D-Renderschleife

Unabhängig davon, was Sie zeichnen, sollte Ihr Programm eine Schleife ähnlich der folgenden ausführen.

  1. Erstellen sie geräteunabhängige Ressourcen.
  2. Rendern Sie die Szene.
    1. Überprüfen Sie, ob ein gültiges Renderziel vorhanden ist. Erstellen Sie andernfalls das Renderziel und die geräteabhängigen Ressourcen.
    2. Rufen Sie ID2D1RenderTarget::BeginDraw auf.
    3. Geben Sie Zeichenbefehle aus.
    4. Rufen Sie ID2D1RenderTarget::EndDraw auf.
    5. Wenn EndDrawD2DERR_RECREATE_TARGET zurückgibt, verwerfen Sie das Renderziel und die geräteabhängigen Ressourcen.
  3. Wiederholen Sie Schritt 2, wenn Sie die Szene aktualisieren oder neu zeichnen müssen.

Wenn das Renderziel ein Fenster ist, wird Schritt 2 immer dann ausgeführt, wenn das Fenster eine WM_PAINT Nachricht empfängt.

Die hier gezeigte Schleife behandelt den Geräteverlust, indem die geräteabhängigen Ressourcen verworfen und am Anfang der nächsten Schleife neu erstellt werden (Schritt 2a).

Nächste

DPI und Device-Independent Pixel