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));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值