Share via


GDI Surface로 렌더링

경우에 따라 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, DrawInlineObjectDrawStrikethrough 메서드는 그리기 함수를 수행합니다.

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 함수와 함께 경계 사각형을 사용하여 다음 코드와 같이 메모리 DC에서 GDI 화면으로 렌더링된 DirectWrite 텍스트를 복사할 수 있습니다.

// Transfer from DWrite's rendering target to the window.
BitBlt(
    hdc,
    0, 0,
    size.cx, size.cy,
    memoryHdc,
    0, 0, 
    SRCCOPY | NOMIRRORBITMAP
    );