使用 GDI,沿公共基线对齐文本(以多种不同字体绘制)的最简单方法是什么?
我的问题:
我目前正在开发一个自定义用户控件,该控件在一行上显示文本片段(每个文本片段可能具有不同的字体)。我想将所有这些文本位完全沿着公共基线对齐。例如:
Hello, I am George.
------------------------------ <- all text aligns to a common baseline
^ ^ ^
| | |
Courier Arial Times <- font used for a particular bit of text
20pt 40pt 30pt
因为我还没有找到任何 GDI+ 功能来直接执行此操作,所以我想出了自己的方法(概述如下)。但是:
我想知道是否真的没有更简单的方法来完成此任务?
我当前的方法:
1)收集将用于绘制文本的所有System.Drawing.Font
的列表。
2) 对于每个 Font
,使用以下代码查找基线的垂直位置(以像素为单位):
// variables used in code sample (already set)
Graphics G;
Font font;
...
// compute ratio in order to convert from font design units to pixels:
var designUnitsPerPixel = font.GetHeight(G) /
font.FontFamily.GetLineSpacing(font.Style);
// get the cell ascent (baseline) position in design units:
var cellAscentInDesignUnits = font.FontFamily.GetCellAscent(font.Style);
// finally, convert the baseline position to pixels:
var baseLineInPixels = cellAscentInDesignUnits * designUnitsPerPixel;
3) 对于所有 Font
使用时,确定上面计算的最大baseLineInPixels
值,并将该值存储到maxBaseLineInPixels
。
4) 按照以下方式绘制每一位文本:
// variables used in code sample (already set):
Graphics G;
Font font;
string text;
...
// find out how much space is needed for drawing the text
var measureF = G.MeasureString(text, font);
// determine location where text will be drawn:
var layoutRectF = new RectangleF(new PointF(0f, 0f), measureF);
layoutRectF.Y += maxBaseLineInPixels - baseLineInPixels;
// ^ the latter value 'baseLineInPixels' is specific to the font used
// draw text at specified location
G.DrawString(text, font, Brushed.Black, layoutRectF);
我是否遗漏了什么,或者真的没有更简单的方法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为这个方法可行,请你尝试一下。
I thinks this way is work , please you try.
过去几天我一直在研究同样的事情,终于找到了答案在此博客页面。这段代码(在文章底部)对我来说非常有效,希望能帮助其他人解决这个问题:
I've been researching the same thing for the last few days, and I finally found an answer on this blog page. This code (at the bottom of the article) worked really well for me and hopefully helps anyone else struggling with this problem: