这是一些用linqpad编写的C#代码来重现这个问题。
var font = new System.Drawing.Font("Arial", 8);
using (var g = System.Drawing.Graphics.FromHwnd(IntPtr.Zero))
{
//65536 characters is fine
g.DrawString("a".PadLeft(65535, 'a'), font, System.Drawing.Brushes.Black, new System.Drawing.RectangleF(0, 0, 1, 1));
//65537 characters causes an error.
g.DrawString("a".PadLeft(65536, 'a'), font, System.Drawing.Brushes.Black, new System.Drawing.RectangleF(0, 0, 1, 1));
//65537 characters is however fine if the width is over 600581
g.DrawString("a".PadLeft(65536, 'a'), font, System.Drawing.Brushes.Black, new System.Drawing.RectangleF(0, 0, 600582, 1));
}
任何人都知道字符串的长度和布局矩形的宽度之间的确切关系?数字600581似乎很随意。虽然65536更有意义,因为它是0x10000。
答案 0 :(得分:2)
任何人都知道字符串长度和字符串之间的确切关系 布局矩形的宽度?数字600581似乎很随意。
数字600581确实是任意的,在这种情况下它反映了字体字符宽度(或字体的字形)。
以600581 / 65536
为例,它给出了每个字符9.16像素的平均字符宽度,这对于包含间距的Arial等相当平方的字体是合理的。除此之外,GDI +还在文本的边界框中添加了填充。
如果您尝试更宽的(或更窄的字体,但除非减少数字就不会注意到)以及不同的字母组合,您应该得到不同的结果。尝试使用单倍间距字体,您应该能够准确预测所需的边界(不要忘记填充)。
如果你真的需要打印长字符串,请尝试缓冲打印,但在这些情况下,GDI +不是你最好的朋友。按照建议尝试TextRenderer
类(GDI包装器):
http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer.aspx