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