C#使用GDI根据文字规格绘制基准线

2 篇文章 0 订阅

由于根据需求需要绘制4线3格显示字母,所以需要知道字体规格的基线(baseline),这里记录下,下面部分摘录自MSDN:

C#获取文字规格的方法在FontFamily类中,对于winform提供以下几个函数:

  • GetEmHeight(FontStyle)

  • GetCellAscent(FontStyle)

  • GetCellDescent(FontStyle)

  • GetLineSpacing(FontStyle)

这些方法返回的数字使用的是字体设计单位,因此,它们与特定的 Font对象的大小和单位无关。

下面的插图显示了各种规格。

下面的示例显示 Arial 字体系列常规字形的规格。 该代码还创建一个大小为 16 像素的 Font对象(基于 Arial 系列),并显示该特定 Font对象的规格(以像素为单位)。

请注意上面的插图中的前两行输出。 Font对象返回的大小为 16, FontFamily对象返回的 em 高度为 2,048。 这两个数字(16 和 2,048)对于在字体设计单位和 Font对象的单位(在本例中为像素)之间进行转换很关键。

例如,您可按照以下方法将升高值从设计单位转换为像素:

 

下面的代码通过设置 PointF对象的 Y 数据成员来在垂直方向上定位文本。 每新增加一行文本,y 坐标就增加 font.Height。 Font对象的 Height属性返回该特定 Font对象的行距(以像素为单位)。 在此示例中, Height返回的数值是 19。 请注意,这与通过将行距单位转换为像素而得到的数字(向上舍入为一个整数)是相同的。

注意 em 高度(也叫大小或 em 大小)不是升高值与降低值之和。 升高值与降低值之和称为单元格高度。 单元格高度减去内部间隙等于 em 高度。 单元格高度加外部间隙等于行距。

 

这里我们创建一个实例,来做测试:

 FontFamily fontFamily = new FontFamily("Arial");
 Font font = new Font( fontFamily,76.8F, FontStyle.Regular, GraphicsUnit.Pixel);
 PointF pointF = new PointF(10, 10);
 SolidBrush solidBrush = new SolidBrush(Color.Black);

 int ascent = fontFamily.GetCellAscent(FontStyle.Regular);
 float ascentPixel = font.Size * ascent / fontFamily.GetEmHeight(FontStyle.Regular);

 

//下基线
e.Graphics.DrawLine(Pens.Red, 100 , 500 + ascentPixel, 800, 500 + ascentPixel);
//上基线
e.Graphics.DrawLine(Pens.Red, 100, 500 + ascentPixel - font.Size / 2, 800, 500 + ascentPixel - font.Size / 2);
e.Graphics.DrawString("abcdefghijklmnopqrstuvwxyz", font, Brushes.Black, 100, 500);

绘制结果如下:

基本符合要求!下基线没问题,上基线为我估算值,可酌情进行调整!

注意红色部分,构建字体时需要和计算时的FontStyle保持一致,同时数据的度量单位一定要为pixel,默认情况下,font的GraphicsUnit为Point.

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破浪征程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值