先上效果:上面的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));}
}