Freigeben über


Rendern DirectWrite

Renderingoptionen

Text, deren Formatierung nur von einem IDWriteTextFormat-Objekt beschrieben wird, kann mit Direct2D gerendert werden. Es gibt jedoch noch einige weitere Optionen zum Rendern eines IDWriteTextLayout-Objekts .

Die durch ein IDWriteTextLayout-Objekt beschriebene Zeichenfolge kann mit den folgenden Methoden gerendert werden.

1. Rendern mit Direct2D

Verwenden Sie zum Rendern eines IDWriteTextLayout-Objekts mit Direct2D die ID2D1RenderTarget::D rawTextLayout-Methode , wie im folgenden Code gezeigt.

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

Ausführlichere Informationen zum Zeichnen eines IDWriteTextLayout-Objekts mit Direct2D finden Sie unter Erste Schritte mit DirectWrite.

2. Rendern mit einem benutzerdefinierten Textrenderer.

Sie rendern mit einem benutzerdefinierten Renderer mithilfe der IDWriteTextLayout::D raw-Methode , die eine von IDWriteTextRenderer abgeleitete Rückrufschnittstelle als Argument verwendet, wie im folgenden Code gezeigt.

// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
        NULL,
        pTextRenderer_,  // Custom text renderer.
        origin.x,
        origin.y
        );

Die IDWriteTextLayout::D raw-Methode ruft die Methoden des von Ihnen bereitgestellten benutzerdefinierten Rendererrückrufs auf. Die Methoden DrawGlyphRun, DrawUnderline, DrawInlineObject und DrawStrikethrough führen die Zeichnungsfunktionen aus.

IDWriteTextRenderer deklariert Methoden zum Zeichnen einer Glyphenausführung, unterstrichenen, durchgestrichenen und Inlineobjekten. Es liegt an der Anwendung, diese Methoden zu implementieren. Durch das Erstellen eines benutzerdefinierten Textrenderers kann die Anwendung beim Rendern von Text zusätzliche Effekte anwenden, z. B. eine benutzerdefinierte Füllung oder Gliederung. Ein beispiel für einen benutzerdefinierten Textrenderer ist im DirectWrite Hallo Welt Sample enthalten.

3. Rendern von ClearType auf einer GDI-Oberfläche.

Das Rendern auf einer GDI-Oberfläche ist eigentlich ein Beispiel für die Verwendung eines benutzerdefinierten Textrenderers. Ein Teil der Arbeit wird jedoch in Form der IDWriteBitmapRenderTarget-Schnittstelle für Sie erledigt.

Verwenden Sie zum Erstellen dieser Schnittstelle die IDWriteGdiInterop::CreateBitmapRenderTarget-Methode .

Die DrawGlyphRun-Methode Ihres benutzerdefinierten Textrenderers ruft die IDWriteBitmapRenderTarget::D rawGlyphRun-Methode auf, um die Glyphen zu zeichnen. Das Rendering der Unterstreichungs-, Durchstreichungs- und Inlineobjekte muss von Ihrem benutzerdefinierten Renderer durchgeführt werden.

Die IDWriteBitmapRenderTarget-Schnittstelle wird in einem Gerätekontext (DC) im Arbeitsspeicher gerendert. Sie erhalten ein Handle für diesen DC, indem Sie die IDWriteBitmapRenderTarget::GetMemoryDC-Methode verwenden.

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

Nachdem die Zeichnung ausgeführt wurde, muss der Speicher dc des IDWriteBitmapRenderTarget-Objekts auf die GDI-Zieloberfläche kopiert werden.

Hinweis

Sie haben auch die Möglichkeit, die Bitmap auf eine andere Art von Oberfläche zu übertragen, z. B. auf eine GDI+-Oberfläche.

 

// Transfer from DWrite's rendering target to the window.
BitBlt(
    hdc,
    0, 0,
    size.cx, size.cy,
    memoryHdc,
    0, 0, 
    SRCCOPY | NOMIRRORBITMAP
    );

Hinweis

Ihre App ist dafür verantwortlich, alles im Fenster am Ende zu rendern. Dies schließt Text und Grafiken ein. Dies hat eine Leistungseinbuße. Darüber hinaus erfolgt das Rendern auf einem Speicher-DC nicht durch GDI-Hardwarebeschleunigt.

 

Eine ausführlichere Übersicht über die Zusammenarbeit mit GDI finden Sie unter Interoperieren mit GDI.

4. Rendern von Graustufentext transparent auf einer GDI-Oberfläche. (Windows 8 und höher)

Ab Windows 8 können Sie Graustufentext transparent auf einer GDI-Oberfläche rendern, um die Leistung zu verbessern. Dazu müssen Sie:

  1. Löschen Sie den Speicher-DC in transparent.
  2. Rendern von Text im HDC des Arbeitsspeichers mithilfe von Graustufen-Antialiasing (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
  3. Verwenden Sie die AlphaBlend-Funktion , um den HdC-Speicher transparent über dem endgültigen Ziel-HDC zu rendern.
  4. Wiederholen Sie so oft wie nötig (z. B. einmal pro Glyphenlauf), und dazwischen können andere Grafiken direkt in der endgültigen Ziel-HDC gerendert werden, ohne von der AlphaBlend-Funktion überschrieben zu werden.
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

BLENDFUNCTION blendFunction = { 0 };  
blendFunction.BlendOp = AC_SRC_OVER;  
blendFunction.SourceConstantAlpha = 255;  
blendFunction.AlphaFormat = AC_SRC_ALPHA;

AlphaBlend(  
        hdc,  
        0, 0,  
        width, height,  
        pRT_->GetMemoryDC(),  
        0, 0,  
        width, height,  
        blendFunction  
        );

Rendern mithilfe von Direct2D

Rendern unter Verwendung eines benutzerdefinierten Textrenderers

Rendern auf einer GDI-Oberfläche

Zusammenarbeit mit GDI