我有一个自定义控件,将来可能会有用户自定义的字体(缩放已经实现)。我必须在两位数下填充一个矩形,形成一个以 10 为基数的数字。我对零、一个或两个数字有不同的颜色。
使用字体 {Name = Microsoft Sans Serif
Size= 16
} 和以下Graphics.MeasureString
方法调用:
g.MeasureString("00", Font);
g.MeasureString("0", Font);
我得到:
- “00”的大小是{Width =
31.5486088
Height =26.8124962
} - “0”的大小是{Width =
19.3298588
Height =26.8124962
}
“0”的宽度比“00”的一半大得多。
我知道方法Graphics.MeasureString,它有很多重载,我也知道 StringFormat 类。如何正确计算“0”字符的宽度?
因为字体将是用户可自定义的,所以我不想使用等宽字体来解决问题。
如果我使用以下调用:
g.MeasureString("00", Font, 999, StringFormat.GenericTypographic);
g.MeasureString("0", Font, 999, StringFormat.GenericTypographic);
“0”的宽度似乎是“00”宽度的一半,但是用较小的字体大小绘制时数字重叠:
更新:在 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 的高度留出一定百分比的空间。字体应该适应矩形。