渲染 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 方法會呼叫您提供的自訂轉譯器回呼方法。 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
);
相關主題
-
使用 Direct2D 呈現
-
與 GDI 互作