共用方式為


渲染 DirectWrite

渲染選項

只有由 IDWriteTextFormat 物件描述的文字可以使用 Direct2D來呈現,然而,對於呈現 IDWriteTextLayout 物件,還有其他一些選項。

您可以使用下列方法來轉譯 IDWriteTextLayout 物件所描述的字串。

1. 使用 Direct2D 渲染

若要使用 Direct2D 轉譯 IDWriteTextLayout 物件,請使用 ID2D1RenderTarget::D rawTextLayout 方法,如下列程式代碼所示。

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

如需深入瞭解如何使用 Direct2D繪製 IDWriteTextLayout 物件,請參閱 開始使用 DirectWrite

2.使用自定義文字轉譯器進行轉譯。

您可以使用 IDWriteTextLayout::D raw 方法來轉譯自定義轉譯器,此方法會採用衍生自 IDWriteTextRenderer 的回呼介面, 做為自變數,如下列程式代碼所示。

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

IDWriteTextLayout::Draw 方法會呼叫您提供的自訂轉譯器回呼方法。 DrawGlyphRunDrawUnderlineDrawInlineObject,以及 DrawStrikethrough 方法執行繪圖函式。

IDWriteTextRenderer 宣告繪製字形執行、底線、刪除線和內嵌物件的方法。 實作這些方法由應用程式決定。 建立自定義文字轉譯器可讓應用程式在轉譯文字時套用其他效果,例如自定義填滿或外框。 DirectWrite Hello World 範例中包含範例自定義文字轉譯器。

3. 將 ClearType 渲染到 GDI 繪製表面。

轉譯至 GDI 介面實際上是使用自定義文字轉譯器的範例。 不過,某些工作已經以 IDWriteBitmapRenderTarget 介面的形式為您完成。

若要建立此介面,請使用 IDWriteGdiInterop::CreateBitmapRenderTarget 方法。

自定義文字轉譯器 DrawGlyphRun 方法會呼叫 IDWriteBitmapRenderTarget::D rawGlyphRun 方法來繪製字元。 要由您的自定義轉譯器來處理底線、刪除線和內嵌物件的呈現。

IDWriteBitmapRenderTarget 介面會在記憶體中轉譯為裝置內容 (DC)。 您可以使用 IDWriteBitmapRenderTarget::GetMemoryDC 方法來取得此 DC 的控制代碼。

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

執行繪圖之後,必須將 IDWriteBitmapRenderTarget 對象的記憶體 DC 複製到目的地 GDI 介面。

備註

您也可以選擇將點陣圖傳輸至另一種類型的表面,例如 GDI+ 表面。

 

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

注意

您的應用程式必須負責將所有項目轉譯到最後的視窗。 這包括文字和圖形。 這會導致效能下降。 此外,轉譯至記憶體DC不是 GDI 硬體加速。

 

如需與 GDI 互通的詳細概觀,請參閱 與 GDI 互作

4.以透明方式將灰階文字轉譯至 GDI 表面。 (Windows 8 和更新版本)

從 Windows 8 開始,您可以將灰階文字透明呈現至 GDI 表面,以提升效能。 若要這樣做,您需要:

  1. 將記憶體DC清除為透明。
  2. 使用灰階反鋸齒(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE)將文字轉譯至記憶體 HDC。
  3. 使用 AlphaBlend 函式,以透明的方式將記憶體 HDC 轉譯於最終目標 HDC 之上。
  4. 視需要重複多次 (例如,每個字元執行一次),在其他圖形之間,可能會直接轉譯為最終目標 HDC,而不會由 AlphaBlend 函式覆寫。
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  
        );

使用 Direct2D 呈現

使用自訂文字渲染器進行渲染

轉譯至 GDI 介面

與 GDI 互作