다음을 통해 공유


렌더링 DirectWrite

렌더링 옵션

IDWriteTextFormat 개체에서만 설명하는 서식이 있는 텍스트는 Direct2D로 렌더링할 수 있지만 IDWriteTextLayout 개체를 렌더링하는 몇 가지 추가 옵션이 있습니다.

IDWriteTextLayout 개체에서 설명하는 문자열은 아래 메서드를 사용하여 렌더링할 수 있습니다.

1. Direct2D를 사용하여 렌더링

Direct2D 를 사용하여 IDWriteTextLayout 개체를 렌더링하려면 다음 코드와 같이 ID2D1RenderTarget::D rawTextLayout 메서드를 사용합니다.

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

Direct2D를 사용하여 IDWriteTextLayout 개체를 그리는 방법에 대한 자세한 내용은 DirectWrite 시작 참조하세요.

2. 사용자 지정 텍스트 렌더러를 사용하여 렌더링합니다.

다음 코드와 같이 IDWriteTextRenderer에서 파생된 콜백 인터페이스를 인수로 사용하는 IDWriteTextLayout::D raw 메서드를 사용하여 사용자 지정 렌더러로 렌더링합니다.

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

IDWriteTextRenderer 는 문자 모양 실행, 밑줄, 취소선 및 인라인 개체를 그리는 메서드를 선언합니다. 이러한 메서드를 구현하는 것은 애플리케이션의 입니다. 사용자 지정 텍스트 렌더러를 만들면 애플리케이션에서 사용자 지정 채우기 또는 윤곽선과 같은 텍스트를 렌더링할 때 추가 효과를 적용할 수 있습니다. 샘플 사용자 지정 텍스트 렌더러는 DirectWrite 헬로 월드 샘플에 포함됩니다.

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 Surface에 투명하게 렌더링합니다. (Windows 8 이상)

Windows 8 시작하여 GDI 화면에 회색조 텍스트를 투명하게 렌더링하여 성능을 향상할 수 있습니다. 이렇게 하려면 다음을 수행해야 합니다.

  1. 투명하게 메모리 DC를 지웁다.
  2. 회색조 앤티앨리어싱(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE)을 사용하여 메모리 HDC에 텍스트를 렌더링합니다.
  3. AlphaBlend 함수를 사용하여 최종 대상 HDC 위에 메모리 HDC를 투명하게 렌더링합니다.
  4. 필요에 따라 여러 번 반복(문자 모양 실행당 한 번) 다른 그래픽 간에 AlphaBlend 함수로 덮어쓰지 않고 최종 대상 HDC에 직접 렌더링될 수 있습니다.
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 화면에 렌더링

GDI와 상호 운용