2017-12-07 23 views
1

일부 글꼴이 선택된 장치 컨텍스트가 있으며 ID2D1RenderTargetDrawText을 사용하고 싶습니다.DirectWrite GDI interop : 'IDWriteFontFace`를 사용하여 텍스트를 그리는 간단한 방법

현재, 나는 다음과 같은 경로가이 acchieve로 이동합니다

  • IDWriteFontFaceCreateFontFaceFromHdc를 통해 가져옵니다.
  • 기본 시스템 글꼴 모음 (GetSystemFontCollection을 통해 얻을 - 다음 단계 참조)을 통해 IDWriteFontFace에서 IDWriteFont을 얻습니다.
  • 내가 기본 시스템 글꼴 모음을 사용하고자하는 것을 나타내는 IDWriteFont에 지정된 매개 변수를 공급하고 fontCollectionnullptr를 지정 CreateTextFormat 통해 IDWriteTextFormat를 얻습니다.
  • IDWriteTextFormatDrawText으로 전달하십시오.

내가 이것에 대해 이상한 찾으 이미 첫 번째 단계에서 IDWriteFontFace 있고, 분명히 "위로"와, 단지 DrawTextFormat에 그 전달하기 위해, IDWriteFont의 글꼴 모음을 요청해야한다는 것입니다있는 그 다음 DrawText까지 사용할 수 있습니다. 이것은 불필요하게 복잡해 보입니다 - 특히 텍스트를 그릴 때부터 시스템이 어쨌든 IDWriteFontFace으로 내려 갔을 것입니다. 맞습니까?

나는 DrawGlyphRun을 발견했다. baselineOrigin은 사전에 계산해야합니다 (glyphRun은 말할 것도 없습니다).

이미 IDWriteFontFace이있는 경우 ID2D1RenderTarget에 텍스트를 그릴 수있는 간단한 방법이 없습니까?

+1

실제로 선택한 글꼴 AddFontMemResourceEx()에서 오는 경우 어떻게 될지 잘 모르겠습니다. 이 경우 시스템 콜렉션에서 사용할 수 없습니다. – bunglehead

답변

1

설명 된 것처럼 그게 유일한 방법입니다. 텍스트 형식의 인스턴스를 구성하기 위해 돌아가서 DirectWrite 스타일 렌더링에 사용합니다. DrawGlyphRun은 낮은 수준의 방법이므로 당연히 사용할 수 있지만 직접 레이아웃 로직을 많이 구현해야하며 피할 수있는 방법입니다. 일반적으로 DrawText을 사용하는 것은 Direct2D를 사용하여 렌더링 할 때 가장 효율적인 방법이며 더 좋은 방법은 레이아웃 개체를 한 번 만들고 다시 그릴 때마다 사용하는 것입니다.

+0

고마워요! 하지만'IDWriteTextLayout'을 생성하려면 먼저 IDWriteTextFormat이 필요합니다. 그래서'IDWriteFontFace'를 사용할 수 없습니까? – phimuemue

+0

네, 포맷 오브젝트도 필요합니다. 복잡성은 처음부터 GDI interop을 사용하고 있다는 사실에서 비롯됩니다. DrawText를 사용하려면 성 및 글꼴 속성을 알아야합니다. 그리고 다시, 내 다른 의견을 참조하십시오, 나는 그것이 메모리 글꼴 자원에 대해 어떻게 작동하는지 모르겠다. 그것은 제한 요소이기도하다. – bunglehead