我有一个自定义控件,将来可能有用户可自定义的字体(缩放已经实现)。我必须在两位数字下方填充一个矩形,形成以 10 为基数的数字。我对零个、一个或两个数字有不同的颜色。
使用字体 {Name =Microsoft Sans Serif
Size=16
以及以下内容Graphics.MeasureString
方法调用:
g.MeasureString("00", Font);
g.MeasureString("0", Font);
I get:
- “00”的大小为{宽度=
31.5486088
高度=26.8124962
}
- “0”的大小为{宽度=
19.3298588
高度=26.8124962
}
“0”的宽度比“00”宽度的一半大很多。
我知道这些方法图形.测量字符串 https://learn.microsoft.com/en-us/dotnet/api/system.drawing.graphics.measurestring,它有很多重载,而且我也知道 StringFormat 类。如何正确计算“0”字符的宽度?
因为字体是用户可自定义的,所以我不想使用等宽字体来解决问题。
如果我使用以下调用:
g.MeasureString("00", Font, 999, StringFormat.GenericTypographic);
g.MeasureString("0", Font, 999, StringFormat.GenericTypographic);
“0”的宽度似乎是“00”宽度的一半,但是当用较小的字体大小绘制时,数字会重叠:
Update:在 UserControl 的 OnPaint 方法中,我有以下代码:
Graphics g = e.Graphics;
int[] indices = { 0, 1 };
CharacterRange[] charRanges = new CharacterRange[indices.Length];
for (int chx = 0; chx < indices.Length; ++chx)
{
charRanges[chx] = new CharacterRange(indices[chx], 1);
}
StringFormat sf = new StringFormat(StringFormat.GenericDefault);
sf.SetMeasurableCharacterRanges(charRanges);
Region[] regions = e.Graphics.MeasureCharacterRanges("01", Font, e.ClipRectangle, sf);
RectangleF[] r = new RectangleF[regions.Length];
int i = 0;
foreach (Region rr in regions)
{
r[i] = rr.GetBounds(g);
g.DrawRectangle(Pens.Blue, r[i].X, r[i].Y, r[i].Width, r[i].Height);
++i;
}
g.DrawString("0", Font, Brushes.Black, r[0], sf);
g.DrawString("1", Font, Brushes.Black, r[1], sf);
字体是{Name = "Microsoft Sans Serif" Size=25}
。运行程序时,可以看到以下内容:
我想让数字位于蓝色矩形的中心。 UserControl 中的矩形必须尽可能大,但也要为 UserControl 高度的百分比留出空间。字体应适应矩形。