我的问题:
我目前正在开发一个自定义用户控件,该控件在一行上显示文本片段(每个文本都有可能不同的字体)。我想将所有这些文本位完全沿着一个共同的基线对齐。例如:
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
收集将用于绘制文本的所有 s 的列表。
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
使用的 s,确定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);
我错过了什么,还是真的没有更简单的方法?