Как да приложа ефекта на контур върху текст с WindowsAPICodePack?

Все още се боря по този въпрос, след като другите ни изисквания приключиха. Открих, че можем да използваме класове, подобни на GeometrySink, за да реализираме ефекта на контура; но не съм запознат с c++; вижте тази статия: http://msdn.microsoft.com/en-us/library/dd317121.aspx

По-сложни форми могат да бъдат създадени чрез използване на интерфейса ID2D1GeometrySink за определяне на поредица от фигури, съставени от линии, криви и дъги. ID2D1GeometrySink се предава на метода Open на ID2D1PathGeometry за генериране на сложна геометрия. ID2D1SimplifiedGeometrySink може също да се използва с DirectWrite API за извличане на контури на пътя на форматиран текст за художествено изобразяване.

Ако имате някакви предложения или идеи, моля, уведомете ме.

С най-добри пожелания, Хауърд


person Howard    schedule 27.09.2011    source източник


Отговори (2)


Използвам 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);
        }

    }
person Dennis Smit    schedule 29.04.2012

Превърнах това в генеричен инструмент за изобразяване на текст в контур на XAML. Благодаря за публикацията.

https://blogs.msdn.microsoft.com/theuxblog/2016/07/09/outline-text-from-a-windows-10-store-xaml-app-using-sharpdx/

Наздраве, Пол

person Paul    schedule 09.07.2016