GDI Surface'a işleme
Bazı durumlarda, DirectWrite metnini GDI yüzeyinde görüntüleyebilmek isteyebilirsiniz. IDWriteBitmapRenderTarget arabirimi, metni render etmek için bir bitmap ve cihaz bağlamını kapsüller. Aşağıdaki kodda gösterildiği gibi IDWriteGdiInterop::CreateBitmapRenderTargetyöntemini kullanarakIDWriteBitmapRenderTarget oluşturursunuz.
if (SUCCEEDED(hr))
{
hr = g_pGdiInterop->CreateBitmapRenderTarget(hdc, r.right, r.bottom, &g_pBitmapRenderTarget);
}
IDWriteBitmapRenderTargetile işlemek için, IDWriteTextRenderer arabiriminden türetilen özel bir metin işleyici geri çağırma arabirimi uygulamanız gerekir. Glif serisi, altı çizili, üstü çizili, satır içi nesneler ve benzeri öğeleri çizmek için yöntemler uygulamanız gerekir. Yöntemlerin tam listesi için IDWriteTextRenderer referans sayfasına bakın. Her yöntemin uygulanması zorunlu değildir, yalnızca E_NOTIMPLdöndürebilirler ve çizim devam eder.
Ardından IDWriteTextLayout::Draw metodunu kullanarak ve parametre olarak uyguladığınız geri çağırma arabirimini geçirerek metni çizebilirsiniz. IDWriteTextLayout::Draw yöntemi, sağladığınız özel işleyici geri çağırma işlevlerinin yöntemlerini çağırır. DrawGlyphRun, DrawUnderline, DrawInlineObjectve DrawStrikethrough yöntemleri çizim işlevlerini gerçekleştirir.
DrawGlyphRunuygulamanızda, IDWriteBitmapRenderTarget::D rawGlyphRun yöntemini çağırarak glifleri çizin. Alt çizgi, üstü çizili ve satır içi nesnelerin işlenmesi, sizin özel işleyiciniz tarafından yapılmalıdır.
IDWriteBitmapRenderTarget::D rawGlyphRun, metnin çizildiği alanın sınırlarını içeren isteğe bağlı bir RECT out parametresine sahiptir. GDI tarafından sağlanan SetBoundsRect işleviyle cihaz bağlamı için sınırlayıcı dikdörtgeni ayarlamak için bu bilgileri kullanabilirsiniz. Aşağıdaki kod, özel işleyicinin DrawGlyphRun yönteminin örnek bir uygulamasıdır.
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 arabirimi bellekteki bir cihaz bağlamına (DC) işlenir. IDWriteBitmapRenderTarget::GetMemoryDC yöntemini kullanarak bu DC'ye bir tanıtıcı elde edersiniz. Çizim gerçekleştirilir gerçekleşmez, IDWriteBitmapRenderTarget nesnesinin bellek DC'si hedef GDI yüzeyine kopyalanmalıdır.
Sınırlayıcı dikdörtgeni almak için GetBoundsRectişlevinive ardından BitBlt işleviyle sınırlayıcı dikdörtgeni kullanarak işlenen DirectWrite metnini aşağıdaki kodda gösterildiği gibi bellek DC'sinden GDI yüzeyine kopyalayabilirsiniz.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);