轉譯為 GDI 介面
在某些情況下,您可能想要能夠在 GDI 介面上顯示DirectWrite文字。 IDWriteBitmapRenderTarget介面會封裝點陣圖和裝置內容,以將文字轉譯到其中。 您可以使用IDWriteGdiInterop::CreateBitmapRenderTarget方法來建立IDWriteBitmapRenderTarget,如下列程式碼所示。
if (SUCCEEDED(hr))
{
hr = g_pGdiInterop->CreateBitmapRenderTarget(hdc, r.right, r.bottom, &g_pBitmapRenderTarget);
}
若要使用 IDWriteBitmapRenderTarget轉譯,您必須實作衍生自 IDWriteTextRenderer 介面的自訂文字轉譯器回呼介面。 您必須實作方法來繪製圖像執行、底線、刪除線、内嵌物件等等。 如需方法的完整清單,請參閱 IDWriteTextRenderer 參考頁面。 並非每個方法都必須實作,它們只能傳回 E_NOTIMPL,而繪圖將會繼續。
接著,您可以使用 IDWriteTextLayout::D raw 方法繪製文字,並傳遞您實作為參數的回呼介面。 IDWriteTextLayout::D raw方法會呼叫您提供的自訂轉譯器回呼方法。 DrawGlyphRun、DrawUnderline、DrawInlineObject和DrawStrikethrough方法會執行繪圖函式。
在您的 DrawGlyphRun實作中,呼叫 IDWriteBitmapRenderTarget::D rawGlyphRun 方法來繪製圖像。 您的自訂轉譯器必須完成底線、刪除線和内嵌物件的轉譯。
IDWriteBitmapRenderTarget::D rawGlyphRun 具有選擇性的 RECT out 參數,其中包含繪製文字的區域界限。 您可以使用這項資訊,使用 GDI 提供的 SetBoundsRect 函式,為裝置內容設定周框。 下列程式碼是自訂轉譯器的 DrawGlyphRun 方法範例實作。
STDMETHODIMP GdiTextRenderer::DrawGlyphRun(
__maybenull void* clientDrawingContext,
FLOAT baselineOriginX,
FLOAT baselineOriginY,
DWRITE_MEASURING_MODE measuringMode,
__in DWRITE_GLYPH_RUN const* glyphRun,
__in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
IUnknown* clientDrawingEffect
)
{
HRESULT hr = S_OK;
// Pass on the drawing call to the render target to do the real work.
RECT dirtyRect = {0};
hr = pRenderTarget_->DrawGlyphRun(
baselineOriginX,
baselineOriginY,
measuringMode,
glyphRun,
pRenderingParams_,
RGB(0,200,255),
&dirtyRect
);
return hr;
}
IDWriteBitmapRenderTarget介面會在記憶體中轉譯為裝置內容 (DC) 。 您可以使用 IDWriteBitmapRenderTarget::GetMemoryDC 方法來取得此 DC 的控制碼。 一旦執行繪圖, IDWriteBitmapRenderTarget 物件的記憶體 DC 必須複製到目的地 GDI 表面。
您可以使用GetBoundsRect函式擷取周框,然後使用周框搭配BitBlt函數,將轉譯的DirectWrite文字從記憶體 DC 複製到 GDI 介面,如下列程式碼所示。
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);