在Windows 10/.NET 4.8/Wforms中,针对表示打印机设备的图形对象测量字符串时,我得到了意外的结果:
var doc = new PrintDocument
{
PrinterSettings = new PrinterSettings
{
PrinterName = "Microsoft Print to PDF",
PrintToFile = true,
PrintFileName = "c:\temp\test.pdf"
}
};
doc.PrintPage += (object sender, PrintPageEventArgs e) =>
{
var font = new Font("Verdana", 8, FontStyle.Regular);
var format = new StringFormat
{
Alignment = StringAlignment.Near,
FormatFlags = StringFormatFlags.LineLimit,
LineAlignment = StringAlignment.Near,
Trimming = StringTrimming.Word,
HotkeyPrefix = HotkeyPrefix.None
};
var text = "0ZG0XLLJ620";
var size = e.Graphics.MeasureString(text, font, new SizeF(300, 1000000), format);
size = e.Graphics.MeasureString(text, font, new SizeF(size.Width, 1000000), format);
e.Cancel = true;
};
doc.Print();
第二次调用MeasureString时,size的高度分量变大,宽度变小。两个调用返回的大小不应该相同吗,尤其是因为第二个调用已经被传递了足够宽的可用空间来容纳文本?
注意,这在Windows7中不会发生。事实上,你可以通过用Windows7中的Verdana覆盖Windows10来解决这个问题。
Windows 10似乎根据渲染到的矩形的大小对字体进行了不同的缩放。这不是一件坏事。
如果不希望布局矩形的大小影响文本的大小,则应使用MeasureString
版本(如果希望绘制的文本与测量的大小匹配,则使用DrawString
版本(,该版本采用原点,而不是布局矩形或布局矩形大小。