4.4.2.5 添加文本标签
我们已经实现了第一个绘图函数,第二个函数也应有同样的签名,以便可以参数值传递给统一的 drawStep 函数。我们在代码中唯一要做的就是绘制标签,计算其位置,如清单 4.11。
清单 4.11 绘制文本标签 (F#)
let fnt = new Font("Times NewRoman", 11.0f)
let centerX, centerY = 300.0, 200.0 | 定义饼图属性
let labelDistance = 150.0 |
let drawLabel(gr:Graphics, title,startAngle, angle) =
letlblAngle = float(startAngle + angle/2) [1]
letra = Math.PI * 2.0 * lblAngle / 360.0 [2]
letx = centerX + labelDistance * cos(ra)
lety = centerY + labelDistance * sin(ra)
letsize = gr.MeasureString(lbl, fnt) | 获得边框
letrc = new PointF(float32(x) - size.Width / 2.0f, | 绘制标签
float32(y) - size.Height /2.0f) |
gr.DrawString(title,fnt, Brushes.Black, new RectangleF(rc, size)) |
我们首先声明一个顶层的字体值,用于绘制文本。这样做是因为,我们不想在每次的函数调用时,都初始化字体的一个新实例。由于字体在应用程序的整个生存期内都需要,因此,我们不显式地释放;当应用程序退出时,.NET 会为我们释放它。函数的前几行代码计算标签的位置。
第一行[1]计算的角度(以度为单位),它指定饼图扇区所占部分的中心,取扇区的起始角度,加上扇区的一半,作为标签的中心。第二行[2]将角度转换成以弧度表示,有了以弧度表示的角以后,就可以使用三角函数 cos 和 sin,计算出标签的 X 和 Y 坐标。我们使用 MeasureString 方法估算文本标签的大小,计算出绘制文本边框的位置,前面计算的 X 和 Y 坐标作为边框的中心。
现在,我们已经完成了绘制文本标签的代码,整个代码就能绘制饼图了。在早先的清单 4.10 中,实现的关键函数(drawChart),执行图表的绘制,函数取 CSV 文件的文件名作为参数值,返回图表的位图。我们现在是所有要做的,就是添加从用户界面调用这个函数的代码。