轉譯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方法會呼叫您提供的自訂轉譯器回呼方法。 DrawGlyphRun、DrawUnderline、DrawInlineObject和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 表面,以提升效能。 若要這樣做,您需要:
- 將記憶體 DC 清除為透明。
- 使用灰階反鋸齒 (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE) 將文字轉譯至記憶體 HDC。
- 使用 AlphaBlend 函式,以透明方式在最終目標 HDC 之上轉譯記憶體 HDC。
- 視需要重複多次 (說,每個字元執行一次) ,而在其他圖形之間,可能會直接轉譯到最終目標 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
);
相關主題