2011-09-27 4 views
0

다른 요구 사항이 완료된 후에도 여전히이 문제에 대해 고심하고 있습니다. 우리는 GeometrySink 클래스를 사용하여 개요 효과를 구현할 수 있음을 발견했습니다. 하지만 나는 C++에 익숙하지 않다. 이 문서를 참조 : http://msdn.microsoft.com/en-us/library/dd317121.aspxWindowsAPICodePack을 사용하여 텍스트에 윤곽 효과를 구현하는 방법은 무엇입니까?

더 복잡한 형상이 라인, 곡선, 원호 이루어지는 도면의 일련의 지정 ID2D1GeometrySink 인터페이스를 사용하여 생성 될 수있다. ID2D1GeometrySink는 ID2D1PathGeometry의 Open 메서드에 전달되어 복잡한 지오메트리를 생성합니다. ID2D1SimplifiedGeometrySink는 DirectWrite API 과 함께 사용하여 예술적 렌더링을위한 형식이 지정된 텍스트의 윤곽선을 추출 할 수도 있습니다.

제안 사항이나 아이디어가 있으면 알려 주시기 바랍니다.

안부, 하워드

답변

1

내가 SharpDX를 사용합니다. 여기에 코드 조각이 있습니다 (이 작업은 진행 중이며 렌더링이 있어야합니다.하지만 아마도 당신이 찾고있는 것일 것입니다).

public class OutlineTextRender : SharpDX.DirectWrite.TextRenderer 
    { 
     readonly Factory _factory; 
     readonly RenderTarget _surface; 
     readonly Brush _brush; 

     public OutlineTextRender(RenderTarget surface, Brush brush) 
     { 
      _factory = surface.Factory; 
      _surface = surface; 
      _brush = brush; 
     } 

     public Result DrawGlyphRun(object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, SharpDX.DirectWrite.GlyphRun glyphRun, SharpDX.DirectWrite.GlyphRunDescription glyphRunDescription, ComObject clientDrawingEffect) 
     { 
      using (PathGeometry path = new PathGeometry(_factory)) 
      { 
       using (GeometrySink sink = path.Open()) 
       { 
        glyphRun.FontFace.GetGlyphRunOutline(glyphRun.FontSize, glyphRun.Indices, glyphRun.Advances, glyphRun.Offsets, glyphRun.IsSideways, (glyphRun.BidiLevel % 2) > 0, sink); 

        sink.Close(); 
       } 

       Matrix matrix = Matrix.Identity; 
       matrix = matrix * Matrix.Translation(baselineOriginX, baselineOriginY, 0); 

       TransformedGeometry transformedGeometry = new TransformedGeometry(_factory, path, matrix); 

       _surface.DrawGeometry(transformedGeometry, _brush); 

      } 
      return new Result(); 
     } 

     public Result DrawInlineObject(object clientDrawingContext, float originX, float originY, SharpDX.DirectWrite.InlineObject inlineObject, bool isSideways, bool isRightToLeft, ComObject clientDrawingEffect) 
     { 
      return new Result(); 
     } 

     public Result DrawStrikethrough(object clientDrawingContext, float baselineOriginX, float baselineOriginY, ref SharpDX.DirectWrite.Strikethrough strikethrough, ComObject clientDrawingEffect) 
     { 
      return new Result(); 
     } 

     public Result DrawUnderline(object clientDrawingContext, float baselineOriginX, float baselineOriginY, ref SharpDX.DirectWrite.Underline underline, ComObject clientDrawingEffect) 
     { 
      return new Result(); 
     } 

     public SharpDX.DirectWrite.Matrix GetCurrentTransform(object clientDrawingContext) 
     { 
      return new SharpDX.DirectWrite.Matrix(); 
     } 

     public float GetPixelsPerDip(object clientDrawingContext) 
     { 
      return 0; 
     } 

     public bool IsPixelSnappingDisabled(object clientDrawingContext) 
     { 
      return true; ; 
     } 

     public IDisposable Shadow 
     { 
      get 
      { 
       return null; 
      } 
      set 
      { 
       // throw new NotImplementedException(); 
      } 
     } 

     public void Dispose() 
     { 

     } 
    } 

    public void strokeText(string text, float x, float y, float maxWidth) 
    { 
     // http://msdn.microsoft.com/en-us/library/windows/desktop/dd756692(v=vs.85).aspx 

     // FIXME make field 
     SharpDX.DirectWrite.Factory factory = new SharpDX.DirectWrite.Factory(SharpDX.DirectWrite.FactoryType.Shared); 

     TextFormat format = new TextFormat(factory, "Verdana", 50); 
     SharpDX.DirectWrite.TextLayout layout = new SharpDX.DirectWrite.TextLayout(factory, text, format, 50, 1000); 





     using (var brush = new SolidColorBrush(_surface, CurrentColor)) 
     { 
      var render = new OutlineTextRender(_surface, brush); 

      layout.Draw(render, x, y); 

      //_surface.DrawTextLayout(new DrawingPointF(x, y), layout, brush); 

     // _surface.DrawGlyphRun(new DrawingPointF(x, y), run, brush, MeasuringMode.Natural); 
     } 

    } 
관련 문제