轉譯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::D raw方法會呼叫您提供的自訂轉譯器回呼方法。 DrawGlyphRunDrawUnderlineDrawInlineObjectDrawStrikethrough方法會執行繪圖函式。

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 交互操作