wpf-绘制文字:DrawText和DrawGlyphRun

先上效果:上面的Hello,world是DrawGlyphRun绘制的,下面的hello是DrawText绘制的。绘制的结果都是不能复制的。
在这里插入图片描述
前台

<local:CanvasCustom x:Name="myCanvas"/>

后台

class CanvasCustom : Canvas {
    
    
    protected override void OnRender(DrawingContext dc)
    {
    
    
        base.OnRender(dc);
        dc.DrawRectangle(Brushes.LightGray, new Pen(Brushes.Blue, 1), new Rect(new Point(20,20), new Size(300,300))); // 绘制外层的矩形
        // 绘制下面的文字
        dc.DrawText(new FormattedText("hello", CultureInfo.CurrentCulture,
            FlowDirection.LeftToRight, new Typeface("Arial"), 40, Brushes.Orange), new Point(50,60));
        // 绘制上面的文字
        Typeface typeface = new Typeface(new FontFamily("Arial"),
                            FontStyles.Italic,
                            FontWeights.Normal,
                            FontStretches.Normal);
        GlyphTypeface glyphTypeface;
        if (!typeface.TryGetGlyphTypeface(out glyphTypeface))
            throw new InvalidOperationException("No glyphtypeface found");
        string text = "Hello, world!";
        double size = 30;
        ushort[] glyphIndexes = new ushort[text.Length];
        double[] advanceWidths = new double[text.Length];
        double totalWidth = 0;
        for (int n = 0; n < text.Length; n++)
        {
    
    
            ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[n]];
            glyphIndexes[n] = glyphIndex;
            double width = glyphTypeface.AdvanceWidths[glyphIndex] * size;
            advanceWidths[n] = width;
            totalWidth += width;
        }
        Point origin = new Point(50, 50);
        GlyphRun glyphRun = new GlyphRun(glyphTypeface, 0, false, size,
            glyphIndexes, origin, advanceWidths, null, null, null, null,
            null, null);
        // 绘制
        dc.DrawGlyphRun(Brushes.Black, glyphRun);
        double y = origin.Y;
        // 绘制线条
        dc.DrawLine(new Pen(Brushes.Red, 1), new Point(origin.X, y),
            new Point(origin.X + totalWidth, y));
        y -= (glyphTypeface.Baseline * size);
        dc.DrawLine(new Pen(Brushes.Green, 1), new Point(origin.X, y),
            new Point(origin.X + totalWidth, y));
        y += (glyphTypeface.Height * size);
        dc.DrawLine(new Pen(Brushes.Blue, 1), new Point(origin.X, y),
            new Point(origin.X + totalWidth, y));
    }
}

猜你喜欢

转载自blog.csdn.net/pxy7896/article/details/118959470
今日推荐